1. 程式人生 > >小米前端二面面經

小米前端二面面經


title: 小米前端二面面經
toc: true
date: 2018-10-20 13:04:04
categories:

  • Web

tags:

  • JavaScript
  • HTTP
  • TCP
  • UDP
  • Cookie

正好都是不會的。。。所以完整地記錄一下。

簡單來說就是JS和網路掌握地並不是很全面。

JavaScript嚴格模式

ES5中新增use strict

不允許使用未宣告的變數:

"use strict";
x = 3.14;                // 報錯 (x 未定義)

"use strict";
//  物件也是一個變數。
x = {p1:10, p2:20};      // 報錯 (x 未定義)

不允許刪除變數或物件:

"use strict";
var x = 3.14;
delete x;                // 報錯

不允許刪除函式:

"use strict";
function x(p1, p2) {}; 
delete x;                // 報錯 

不允許變數重名:

"use strict";
function x(p1, p1) {};   // 報錯

不允許使用八進位制:

"use strict";
var x = 010;             // 報錯

不允許使用轉義字元:

"use strict";
var x = \010;            // 報錯

不允許對只讀屬性賦值:

"use strict";
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});

obj.x = 3.14;            // 報錯

不允許對一個使用getter方法讀取的屬性進行賦值:

"use strict";
var obj = {get x() {return 0} };

obj.x = 3.14;            // 報錯

不允許刪除一個不允許刪除的屬性:

"use strict";
delete Object.prototype; // 報錯

變數名不能使用 "eval" 字串:

"use strict";
var eval = 3.14;         // 報錯

變數名不能使用 "arguments" 字串:

"use strict";
var arguments = 3.14;    // 報錯

不允許使用以下這種語句:

"use strict";
with (Math){x = cos(2)}; // 報錯

由於一些安全原因,在作用域 eval() 建立的變數不能被呼叫:

"use strict";
eval ("var x = 2");
alert (x);               // 報錯

禁止this關鍵字指向全域性物件:

function f(){
    return !this;
} 
// 返回false,因為"this"指向全域性物件,"!this"就是false

function f(){ 
    "use strict";
    return !this;
} 
// 返回true,因為嚴格模式下,this的值為undefined,所以"!this"為true。

因此,使用建構函式時,如果忘了加new,this不再指向全域性物件,而是報錯。

function f(){
    "use strict";
    this.a = 1;
};
f();// 報錯,this未定義

作用域、上下文

scope指的是 函式被呼叫的時候, 各個變數的作用區域:

  • 全域性作用域
  • 區域性作用域

content指的是 函式被呼叫的時候, 檢視this指向哪個object, 那麼那個object 就是當前的 "上下文"。

JavaScript中this指向問題(以及不同模式下)

  1. 元素繫結事件,方法中的this是當前操作的元素
  2. 方法名前有點則點前面是誰this就是誰,沒有點則this是window(嚴格模式下是undefined)
  3. 建構函式執行,方法體中的this是當前類的一個例項
  4. 匿名函式具有全域性性,因此this物件通常指向window

第二條也可以理解為:

  • 方法呼叫中誰呼叫this指向誰
  • 全域性作用域或者普通函式中this指向全域性物件window(嚴格模式下不能指向window所以是undefined)

TCP和UDP的區別

參考連結

TCP(Transmission Control Protocol):傳輸控制協議

UDP(User Datagram Protocol):使用者資料報協議

主要從連線性(Connectivity)、可靠性(Reliability)、有序性(Ordering)、有界性(Boundary)、擁塞控制(Congestion or Flow control)、傳輸速度(Speed)、量級(Heavy/Light weight)、頭部大小(Header size)等8個方面來講:

  1. TCP是面向連線(Connection oriented)的協議,UDP是無連線(Connection less)協議;

    TCP用三次握手建立連線:1) Client向server傳送SYN;2) Server接收到SYN,回覆Client一個SYN-ACK;3) Client接收到SYN_ACK,回覆Server一個ACK。到此,連線建成。

    UDP傳送資料前不需要建立連線。

  2. TCP可靠,UDP不可靠;

    TCP丟包會自動重傳,UDP不會。

  3. TCP有序,UDP無序;

    訊息在傳輸過程中可能會亂序,後傳送的訊息可能會先到達,TCP會對其進行重排序,UDP不會。

  4. TCP無界,UDP有界;

    TCP通過位元組流傳輸,UDP中每一個包都是單獨的。

    有界與無界之分是根據接收報文來劃分的,對於TCP協議,客戶端連續傳送資料,只要服務端的這個函式的緩衝區足夠大,會一次性接收過來,即客戶端是分好幾次發過來,是有邊界的,而服務端卻一次性接收過來,所以證明是無邊界的;

    而對於UDP協議,客戶端連續傳送資料,即使服務端的這個函式的緩衝區足夠大,也只會一次一次的接收,傳送多少次接收多少次,即客戶端分幾次傳送過來,服務端就必須按幾次接收,從而證明,這種UDP的通訊模式是有邊界的。

  5. TCP有流量控制(擁塞控制),UDP沒有;

    主要靠三次握手實現。以及慢開始、擁塞避免、快重傳、快恢復

  6. TCP傳輸慢,UDP傳輸快;

    因為TCP需要建立連線、保證可靠性和有序性,所以比較耗時。這就是為什麼視訊流、廣播電視、線上多媒體遊戲等選擇使用UDP。

  7. TCP是重量級的,UDP是輕量級的;

    TCP要建立連線、保證可靠性和有序性,就會傳輸更多的資訊,如TCP的包頭比較大。TCP首部開銷20位元組;UDP的首部開銷小,只有8個位元組

  8. TCP對系統資源要求較多,UDP對系統資源要求較少

  9. 應用場合不同:

    TCP一般應用在對可靠性要求比較高的場合,例如http,ftp等等

    而UDP一般應用在對實時性要求較高場合,例如視訊直播,大檔案傳輸等等

小結:

TCP是面向連線的、可靠的、有序的、速度慢的協議;UDP是無連線的、不可靠的、無序的、速度快的協議。

TCP開銷比UDP大,TCP頭部需要20位元組,UDP頭部只要8個位元組。

TCP無界有擁塞控制,UDP有界無擁塞控制。

補充:

基於TCP的協議有:HTTP/HTTPS,Telnet,FTP,SMTP。

基於UDP的協議有:DHCP,DNS,SNMP,TFTP,BOOTP,IGMP,RIP。

Cookie是否可以跨域

只可以跨二級域名進行訪問

https://blog.csdn.net/u012572955/article/details/61198654

https://www.cnblogs.com/waters/articles/2869855.html

需要認證、跨域時、GATEWAY等HTTP狀態碼

401 Unauthorized —— 請求要求使用者的身份認證

403 Forbidden —— 伺服器理解請求客戶端的請求,但是拒絕執行此請求

502 Bad GateWay —— 充當閘道器或代理的伺服器,從遠端伺服器接收到了一個無效的請求

閉包的優缺點

閉包的作用:儲存、保護

第一個就是可以讀取自身函式外部的變數(沿著作用域鏈尋找)
第二個就是讓這些外部變數始終儲存在記憶體中

優點

  1. 保護函式內的變數安全,加強了封裝性
  2. 在記憶體中維持一個變數(用的太多就變成了缺點,佔記憶體)

缺點:

  1. 由於閉包會使得函式中的變數都被儲存在記憶體中,記憶體消耗很大,所以不能濫用閉包,否則會造成網頁的效能問題,在IE中可能導致記憶體洩露。解決方法是,在退出函式之前,將不使用的區域性變數全部刪除。

  2. 閉包會在父函式外部,改變父函式內部變數的值。所以,如果你把父函式當作物件(object)使用,把閉包當作它的公用方法(Public Method),把內部變數當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函式內部變數的值。