小米前端二面面經
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指向問題(以及不同模式下)
- 元素繫結事件,方法中的this是當前操作的元素
- 方法名前有點則點前面是誰this就是誰,沒有點則this是window(嚴格模式下是undefined)
- 建構函式執行,方法體中的this是當前類的一個例項
- 匿名函式具有全域性性,因此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個方面來講:
TCP是面向連線(Connection oriented)的協議,UDP是無連線(Connection less)協議;
TCP用三次握手建立連線:1) Client向server傳送SYN;2) Server接收到SYN,回覆Client一個SYN-ACK;3) Client接收到SYN_ACK,回覆Server一個ACK。到此,連線建成。
UDP傳送資料前不需要建立連線。
TCP可靠,UDP不可靠;
TCP丟包會自動重傳,UDP不會。
TCP有序,UDP無序;
訊息在傳輸過程中可能會亂序,後傳送的訊息可能會先到達,TCP會對其進行重排序,UDP不會。
TCP無界,UDP有界;
TCP通過位元組流傳輸,UDP中每一個包都是單獨的。
有界與無界之分是根據接收報文來劃分的,對於TCP協議,客戶端連續傳送資料,只要服務端的這個函式的緩衝區足夠大,會一次性接收過來,即客戶端是分好幾次發過來,是有邊界的,而服務端卻一次性接收過來,所以證明是無邊界的;
而對於UDP協議,客戶端連續傳送資料,即使服務端的這個函式的緩衝區足夠大,也只會一次一次的接收,傳送多少次接收多少次,即客戶端分幾次傳送過來,服務端就必須按幾次接收,從而證明,這種UDP的通訊模式是有邊界的。
TCP有流量控制(擁塞控制),UDP沒有;
主要靠三次握手實現。以及慢開始、擁塞避免、快重傳、快恢復
TCP傳輸慢,UDP傳輸快;
因為TCP需要建立連線、保證可靠性和有序性,所以比較耗時。這就是為什麼視訊流、廣播電視、線上多媒體遊戲等選擇使用UDP。
TCP是重量級的,UDP是輕量級的;
TCP要建立連線、保證可靠性和有序性,就會傳輸更多的資訊,如TCP的包頭比較大。TCP首部開銷20位元組;UDP的首部開銷小,只有8個位元組
TCP對系統資源要求較多,UDP對系統資源要求較少
應用場合不同:
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 —— 充當閘道器或代理的伺服器,從遠端伺服器接收到了一個無效的請求
閉包的優缺點
閉包的作用:儲存、保護
第一個就是可以讀取自身函式外部的變數(沿著作用域鏈尋找)
第二個就是讓這些外部變數始終儲存在記憶體中
優點:
- 保護函式內的變數安全,加強了封裝性
- 在記憶體中維持一個變數(用的太多就變成了缺點,佔記憶體)
缺點:
由於閉包會使得函式中的變數都被儲存在記憶體中,記憶體消耗很大,所以不能濫用閉包,否則會造成網頁的效能問題,在IE中可能導致記憶體洩露。解決方法是,在退出函式之前,將不使用的區域性變數全部刪除。
閉包會在父函式外部,改變父函式內部變數的值。所以,如果你把父函式當作物件(object)使用,把閉包當作它的公用方法(Public Method),把內部變數當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函式內部變數的值。