2017騰訊Web前端實習生招聘筆試題總結

weixin_30639719發表於2020-04-05

指標與引用的區別

考察margin塌陷

inline-block元素是否會和其他元素在垂直方向上發生margin重疊?

當然是不會的,margin塌陷僅針對於block元素與block元素,也就是說,inline-block元素和其他元素(block元素或inline-block元素)不會發生margin塌陷。

順便複習一下,margin塌陷有三種情況。

  • 空標籤,沒有高度和寬度的標籤,但是又設定了自己的margin-top和margin-bottom。
  • 如果沒有border, padding, inline content或者bfc的建立和清除將block元素的margin-top和第一個子元素的margin-top分開。或者沒有border, padding, inline content, height, min-height, max-height將block元素單的margin-bottom和最後一個子元素的margin-bottom分開,那麼這些margin就會發生margin collapse。摺疊的邊緣最終在父元素外。來源:mdn
  • 垂直方向上的相鄰元素,它們的margin值不會變,但是在頁面上顯現出來的話,會顯示更大的那一個margin。

考察C++繼承和~符號

考察TCP通訊過程

主要就是三次握手,然後中間發包的過程,以及伺服器是否響應,然後如何斷開連線的。以及客戶端和伺服器端有什麼狀態。

位碼

TCP的位碼,有6個,當它們的值為1時它們是:

  • SYN,表示建立連線
  • FIN,表示關閉連線
  • ACK,表示響應
  • PSH,表示有DATA傳輸
  • RST,表示連線重置
  • URG,表示緊急位元

三次握手

seq是自己資料包本身的序號;ack是期望對方繼續傳送的那個資料包的序號。

TCP三次握手訊號量的含義

三次握手的圖

三次握手與四次揮手抓包圖

大寫表示TCP的位碼,小寫表示包。

  1. client傳送SYN=1(表示請求建立連線), 並置傳送序列號seq=x。

  2. server收到後,傳送SYN=1(表示請求建立連線), 並置確認序號ack=x+1, 同時告訴client自己的序列號為seq=y。

  3. client收到後,告訴server端自己收到了server的確認訊息並準備建立連線,於是將seq=x+1傳送出去,ack=y+1傳送出去。ack表示client希望接受到server傳送的序列號為y+1的資料包。

為什麼不是兩次握手

TCP作為一種可靠的傳輸控制協議,它的核心思想在於: 既要保證資料可靠傳輸,又要提高傳輸的效率。

因為通道是不可靠的,為了防止已失效的連線請求報文段突然又傳送到了服務端,因而產生錯誤。

參考:
為什麼不是兩次握手?

為什麼不是四次握手

三次握手:

“喂,你聽得到嗎?”

“我聽得到呀,你聽得到我嗎?”

“我能聽到你,今天balabala……”


兩次握手:

“喂,你聽得到嗎?”

“我聽得到呀”

“今天…………”

“……誰在說話?”


四次握手:

“喂,你聽得到嗎?”

“我聽得到呀,你聽得到我嗎?”

“我能聽到你,你能聽到我嗎?”

“……不想跟傻逼說話”

作者:匿名使用者
連結:https://www.zhihu.com/question/24853633/answer/114872771
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

四次揮手

由於TCP是全雙工的,所以每個方向都要單獨進行關閉。

  1. 關閉連線時,client向server傳送FIN報文,server收到client的FIN報文通知時,僅僅代表client已經沒有資料要傳送給server了。但是client仍然可以接受資料。

  2. 當server返回ack給client時, 表明server已經知道client沒有資料要傳送了。但是,server仍然可以傳送資料,client仍然可以接送資料。

  3. 當server傳送FIN報文給client時,表明自己也沒有資料要傳送了。

  4. client收到server傳送的FIN報文,然後返回ack表明自己知道了,然後就斷開連線了。

為什麼要四次握手

概括來說,為什麼要四次揮手呢?因為TCP有個半關閉狀態,如果僅僅是client傳送FIN給server端,server端收到FIN返回ack確認的話,這僅僅表明client沒有資料要傳送了,但是仍然可以接受資料, 這叫半關閉。然後server端要傳送FIN報文,表示要釋放連線,然後client收到返回ack確認後,就斷開連線了。

參考

為什麼要四次揮手

為什麼要四次揮手2

三次握手與四次揮手

TCP的狀態

TCP的狀態轉換圖
TCP狀態知識的總結

  1. client--->server, 傳送SYN,seq,然後client進入SYN_SEND狀態。

  2. server--->client, 傳送SYN,seq, ack,然後server進入到SYN_RECV狀態。

  3. client--->server, 傳送seq,ack,此包傳送完畢後,client和server都進入EATABLISHED狀態。

  4. 中間傳送資料。

  5. client--->server,傳送FIN表示要申請斷開請求,同時client進入FIN_WAIT_1狀態。

  6. server端收到client端的FIN,返回ack確認已經收到,同時server進入CLOSE_WAIT狀態(因為自己有資料要傳送給client,所以得等到自己想要斷開連線時)。

  7. client端收到server端的ack,然後進入到FIN_WAIT_2狀態。

  8. server端向client端傳送FIN,表示請求斷開連線,並進入到LAST_ACK狀態(等待client的確認)。

  9. client端收到server端的FIN,返回ack確認已經收到,並進入到TIME_WAIT狀態(等待足夠的時間以確保遠端TCP接受到連線中斷請求的確認 )。

  10. server端收到client端的確認,進入到CLOSED狀態(即沒有任何連線狀態)。

考察嚴格模式

阮一峰嚴格模式

var a = 5;
(function() {
    var a = b = 3;
})();
console.log(a);
console.log(b);

如果是上面的程式碼,會輸出什麼?

我想很多人都會知道,輸出5和3。因為b前面沒有var宣告,會被當作全域性變數宣告。

"use strict";
var a = 5;
(function() {
    var a = b = 3;
})();
console.log(a);
console.log(b);

那麼,如果在嚴格模式下會怎麼辦呢?

會在var a = b = 3;丟擲未捕獲的異常。b is not defined, 即全域性變數必須顯示宣告。

程式/執行緒同步的方式

C++

short result = 2017;
result = result << 5;
result = result >> 5;
cout<<result;

計算機網路

交換機屬於哪一層?

補充:

  1. 物理層:網線,集線器

  2. 資料鏈路層:網路卡,交換機

  3. 網路層:路由器

  4. 運輸層

  5. 應用層

HTTP2的新特性有哪些?

  1. 基於二進位制的協議

  2. 連線的多路複用, 這意味著,一個TCP連線,可以請求多個資源

  3. 流的優先順序

  4. 伺服器推送(伺服器主動推送)

  5. 重置流

參考:

來源知乎

狀態碼總結

來源, 需要FQ。

  1. 1XX, 表示訊息
  2. 2XX, 表示成功
  3. 3XX, 表示重定向
  4. 4XX,表示客戶端錯誤
  5. 5XX,表示伺服器錯誤

常見的狀態碼:

  • 100, client應該繼續傳送請求,即繼續。
  • 101, server通知client修改協議,也就說,client需要採用新的協議版本去訪問server。
  • 200, 請求已成功。
  • 200 ~ 207
  • 300 Multiple Choices 如果請求一個指向多個資源的URL時,會返回這個狀態碼,比如某個伺服器上有某個HTML檔案的中文和英文版本。
  • 301永久重定向
  • 302臨時重定向,HTTP1.0的狀態碼。
    1. client向server傳送post請求。
    2. server返回URL和302。
    3. 等待使用者確認。
    4. 使用者確認後,client使用post訪問URL。
  • 303臨時重定向,HTTP1.1的狀態碼
    1. client向server傳送非get、head請求。
    2. server返回URL和303。
    3. client使用get訪問URL。
  • 307臨時重定向,HTTP1.1的狀態碼
    1. client向server傳送非get、head請求。
    2. server返回URL和307。
    3. 等待使用者確認。
    4. 使用者確認後,post訪問URL, 並不會重定向為get方法訪問URL。
  • 300 ~ 307
  • 400 ~ 418
  • 421 ~ 426
  • 449, 451
  • 400, Bad Request, 語法錯誤,伺服器無法理解。
  • 401, Unauthorized, 未被授權。登入失敗,此錯誤表明傳輸給伺服器的證照與登入伺服器所需的證照不匹配。
  • 402, 預留的
  • 403, Forbidden, 伺服器已經能夠理解,但是進位制執行它, 一般來說是,客戶端許可權不夠。
  • 404, NOT FOUND
  • 405, Method Not Allowed, 請求行中指定的請求方法不能用於請求相應的資源。
  • 406, Not Acceptable, 請求的資源的內容特性無法滿足請求頭中的條件,因此無法生成響應實體。
  • 500 ~ 510
  • 500, Internal Server Error, 伺服器遇到了一個未曾預料的狀況,導致了不能進一步的處理,一般來說,這個錯誤出現在程式程式碼出問題時。
  • 501, Not Implemented, 伺服器不支援當前請求所需要的某個功能, 可能是伺服器無法識別請求的方法。
  • 502, Bad Gateway, 作為閘道器或代理工作的伺服器嘗試執行請求時,從上游伺服器接受到無效的響應。
  • 503, Service Unavailable, 由於臨時的伺服器維護或過載,伺服器無法處理請求。
  • 504, Gateway Timeout, 作為閘道器或代理工作的伺服器嘗試請求時,未能及時從上游伺服器或者輔助伺服器收到響應。
  • 505, HTTP Version Not Supported, 伺服器不支援,或者拒絕支援在請求中使用的HTTP版本。

200與304的區別

  • 第一次請求成功,是200。重新整理後,也是200,表示從瀏覽器快取裡面得到的。不會向伺服器傳送請求。
  • 304的話,是強制重新整理請求,要向伺服器傳送請求,如果伺服器發現和本地檔案是一樣時,就會返回304狀態碼,並且不會傳送檔案,依然是從瀏覽器快取裡獲取的。

程式/執行緒同步

  • 硬體方式
  • 訊號量
  • 管程

考察JavaScript單執行緒

window.setTimeout(function() {
    console.log(1);
}, 1);
window.setTimeout(function() {
    console.log(2);
}, 2);
window.setTimeout(function() {
    console.log(3);
}, 3);
window.requestAnimationFrame(function() {
    console.log(4);
});

上面程式碼執行情況可能有哪幾種?

先說說答案吧,一共有四種情況,分別是:

  • 4123
  • 1423
  • 1243
  • 1234

為什麼是這四種情況呢,setTimeout表示的是隔了多少時間後,就將函式新增到事件處理後面,但是並不代表馬上就要執行。但是為什麼是這樣,我也不清楚,因為。。。

考察IPV6

考察協議

  • DNS
  • FTP
  • TLS
  • POP3
  • HTTP2

考察cookie的缺點

請問:即使使用HTTPS,那麼cookie是明文還是加密的?

XSS攻擊?

考察JavaScript單執行緒

var a = 1;
setTimeout(function() {
    console.log(a);
}, 0);
var date1 = new Date();
while(new Date().getTime() - date1.getTime() <= 10) {
    console.log(a);
}
a = 2;

這道題,也是考察JavaScript的單執行緒,setTimeout的引數即使是0,表示0毫秒過後,將這個事件新增到佇列裡去,但是它依然要等待其他JavaScript程式碼處理結束後,才會執行佇列裡的程式碼。因此它的執行結果是:

  • n個1
  • 2

JavaScript題目

var x = 1;
function a() {
    alert(x);
    var x = 2;
    x++;
    alert(x);
}

function b() {
    alert(x);
    x++;
    alert(x);
}

if(0 < 100 < 0) {
    a();
} else {
    b();
}

if(0 < 100 < (0 + 4)) {
    a();
} else {
    b();
}

經過測試,發現這道題,考察的是if語句資料型別的轉換。它的實際過程是這麼回事:

  1. 0小於100返回true,true再次被比較時回被轉為1。
  2. true 小於 0 返回false,所以第一個if語句將會執行函式b裡的程式碼。
  3. 會依次彈出1, 2。
  4. 第二個if 0 小於 100會返回true,true會被轉為1。
  5. true 小於 4返回true,所以第二個if將會執行函式a裡的程式碼。
  6. 會依次彈出undefined, 3。
// 即
1 2 undefined 3

考察nodejs

考察UDP的首部頭

UDP首部與偽首部

UDP的首部由8個位元組組成。

  • 源埠:2個位元組。
  • 目的埠:2個位元組。
  • 長度:2個位元組。
  • 檢驗和:2個位元組。

考察TCP的首部

TCP首部欄位

一個TCP報文由TCP首部和資料組成的。TCP報文首部的前20個位元組是固定的,後面有4n個位元組是根據需要而增加的, 因此TCP首部的最小長度是20位元組。

20個位元組由以下部分組成:

  • 源埠:2個位元組
  • 目的埠:2個位元組
  • 序號:4個位元組, 因為TCP是面向位元組流的,在一個TCP連線中傳送的位元組流中的每一個位元組都按順序編號。
  • 確認號:4個位元組,是期望收到下一個報文段的第一個資料位元組的序號。
  • 資料偏移:佔4位,它指出TCP報文段的資料起始處距離TCP報文段的起始處有多遠。
  • 保留:佔6位。
  • 6個狀態位:佔6位,URG,ACK,PSH,RST,SYN,FIN。
  • 視窗:佔2個位元組,指的是接受視窗的大小。
  • 檢驗和:佔2個位元組。
  • 緊急指標:佔2個位元組,只有URG=1時才有意義。
  • 選項和填充:一共佔4個位元組,選項大小可變。

排序演算法的時間複雜度,是否是穩定的

什麼是穩定的?穩定其實指的是如果兩個數大小一樣,當經過排序後,它們的順序依然沒有改變,那麼排序就是穩定的。

常見排序演算法是否穩定

  • 氣泡排序,n的平方,穩定
  • 插入排序,n的平方,穩定
  • 歸併排序,n的log2n,穩定
  • 基數排序,d(r+n), 穩定, r代表關鍵字的基數,d代表長度,n代表關鍵字的個數。
  • 快速排序,n的log2n, 不穩定
  • 希爾排序,n的1.3次方,不穩定
  • 選擇排序,n的平方,不穩定
  • 堆排序,n的log2n, 不穩定

sizeof(double)是表示式還是函式?

sizeof不是函式,它是編譯時處理的,函式只能在執行時求值。

描述:有一棵樹,它的度是4。度為4的節點個數是1,度為3的節點個數是2,度為2的節點個數是3,度為1的節點個數是4,問總節點的個數和節點為0的個數是多少。

所謂度就是節點子樹的個數,即分支數目,我畫出來是21個節點,度為0的個數是11。

網站效能優化的方法有哪些?

參見雅虎軍規。

從輸入URL到頁面載入的過程

參見google。

求任意整數有多少種解法

2 = 1 + 1
3 = 1 + 2
4 = 1+ 3;4 = 2 + 2;

給定有序陣列,求出數字出現的次數

可以自己設定一個hashTable

宣告

如果您發現文中有錯誤,請進快聯絡我。 如果您覺得本文對您有幫助,請幫忙點一下推薦,謝謝您。

轉載於:https://www.cnblogs.com/yzfdjzwl/p/6668358.html

相關文章