前端面試小知識

瀏覽器中輸入url 後發生了什麼

```

1。dns域名解析(DNS解析(域名解析),DNS實際上是一個域名和IP對應的資料庫)

a。瀏覽器自身dns

b。作業系統dns

c。 讀取hosts檔案

d。 域名伺服器發起請求

2。建立tcp連線(三次握手)

a。第一次握手:客戶端向伺服器端傳送請求(SYN=1) 等待伺服器確認;

b。第二次握手:伺服器收到請求並確認,回覆一個指令(SYN=1,ACK=1);

c。第三次握手:客戶端收到伺服器的回覆指令並返回確認(ACK=1)

透過三次握手,建立了客戶端和伺服器之間的連線,現載可以請求和傳輸資料了。

3。發起http請求

a。請求報文

-1。 報文首部

1-1。請求行(方法,urI,http)

1-2請求首部欄位

1-3通用首部欄位

1-4其他 cookie 服務端收到cookie資訊

-2。空行

-3 報文主體

4。接受響應效果

響應報文

-1。 報文首部

1-1。狀態行(狀態碼狀態語)

1-2響應首部欄位

1-3通用首部欄位

1-4其他 cookie 服務端收到cookie資訊

1-5 實體首部欄位

-2。空行

-3 報文主體

5。瀏覽器解析HTML

a。 構建dom 樹 構成渲染樹

b。 下載資源

1-1 css 下載同時,繼續解析

1-2 js 等待下載並執行否再解析

預載入器(一個輕量級解析器,指令碼阻塞時,解析HTML中外部資源引入,並進行將在(不會改變dom樹,這是有主解析完成))

6。瀏覽器佈局渲染

a。 佈局 根據渲染樹佈局,計算每個節點的幾何資訊(在視口中的大小和位置) 所有相對度量單位都被轉換為螢幕上的絕對畫素位置

b。 繪製。在螢幕上繪製各個節點

()

```

型別判斷的方法

```

1。 typeof

* typeof null結果是object ,實際這是typeof的一個bug,null是原始值,非引用型別

* typeof [1, 2]結果是object,結果中沒有array這一項,引用型別除了function其他的全部都是object

* typeof Symbol() 用typeof獲取symbol型別的值得到的是symbol,這是 ES6 新增的知識點

2。 instanceof

用於例項與建構函式的對應

eg:

function Foo(name) {

this。name = name

}

var foo = new Foo(‘bar’)

console。log(foo instanceof Foo) true

3。 constructor

4。 Object。prototype。toString。call()

eg:

var Type = (function() {

var type = {};

var typeArr = [’String‘, ’Object‘, ’Number‘, ’Array‘,’Undefined‘, ’Function‘, ’Null‘, ’Symbol‘];

for (var i = 0; i < typeArr。length; i++) {

(function(name) {

type[’Is‘ + name] = function(obj) {

return Object。prototype。toString。call(obj) == ’[object ‘ + name + ’]‘;

}

})(typeArr[i]);

}

return type;

})();

呼叫方法:Type。IsFunction(function() {}) Type。IsObject({})。。。。。

```

### 陣列物件字串的原生方法

```

陣列

陣列| header 2

賦值方法| pop 和 push shift 和 unshift splice reverse sort

訪問方法|concat join slice toString indexOf lastIndexOf

迭代方法|forEach map filter some every reduce reduceRight

字串

1。轉換為字串型別(三種實現方式)

var num=110;

var mystr=num。toString(); //“110”

var num=111;

var mystr=String(num); //“111”

var num=112;

var mystr=“” + num; //“112”

2。字串分割返回新的陣列

var mystr=“qingchenghuwoguoxiansheng,woaishenghuo,woaiziji”;

var arr1=mystr。split(“,”); //[“qingchenghuwoguoxiansheng”,“woaishenghuo”,“woaiziji”];

var arr2=mystr。split(“”); //[“q”,“i”,“n”,“g”,“c”,“h”,“e”,“n”,“g”,“h”,“u”,“w”,“o”,“g”,“u”,“o”,“x”,“i”,“a”,“n”,“s”,“h”,“e”,“n”,“g”,“,”

,“w”,“o”,“a”,“i”,“s”,“h”,“e”,“n”,“g”,“h”,“u”,“o”,“,”,“w”,“o”,“a”,“i”,“z”,“i”,“j”,“i”];

:split()的第二個引數,表示返回的字串陣列的最大長度

var mystr=“qingchenghuwoguoxiansheng,woaishenghuo,woaiziji”;

var arr1=mystr。split(“,”,2); //[“qingchenghuwoguoxiansheng”,“woaishenghuo”];

var arr2=mystr。split(“”,8); //[“q”,“i”,“n”,“g”,“c”,“h”,“e”,“n”];

3。字串替換

var mystr=“wozaijinxingzifuchuantihuancaozuo,zifuchuantihuano”;

var replaceStr=mystr。replace(“zifuchuan”,“ ”); //wozaijinxing tihuancaozuo,zifuchuantihuano

var replaceStr=mystr。replace(/zifuchuan/,“ ”); //wozaijinxing tihuancaozuo,zifuchuantihuano

var replaceStr=mystr。replace(/zifuchuan/g,“ ”); //wozaijinxing tihuancaozuo, tihuano

4。 5。查詢子字串

判斷字串內是否包含子串,不少開發者會使用for迴圈來判斷,而忘記了JavaScript提供子串函式:

indexOf(),該Of() 方法對大小寫敏感。返回字串中一個子串第一處出現的索引(從左到右搜尋)。如果沒有匹配項,返回 -1

lastIndexOf(),該方法對大小寫敏感。返回字串中一個子串最後一處出現的索引(從右到左搜尋),如果沒有匹配項,返回 -1 。

6。返回指定位置的字元或其字元編碼值 charAt

它的一個兄弟函式就是查詢對應位置的字元編碼值

ChartCodeAt

6。 字串的連線

concat()函式可以有多個引數,傳遞多個字串,拼接多個字串。

7。 字串的切割和提取

slice() substring() substr()

1。slice() 可以為負數,如果起始位置為負數,則從字串最後一位向前找對應位數並且向後取結束位置,如果為正整數則從前往後取起始位置到結束位置。

2。substring()只能非負整數,擷取起始結束位置同slice()函式一致。

3。substr()與第一、第二種函式不同,從起始位置開始擷取,結束位置為第二個引數擷取的字串最大長度。

8。 大小寫轉化

toLowerCase() 轉小寫

toUpperCase() 轉大寫

9。 trim() 字串去空格

10 字串去重

eg:

var str=“aahhgggsssjjj”;

function removeRepeat(msg){

var res=[];

var arr=msg。split(“”);

for(var i=0;i

if(res。indexOf(arr[i])==-1){

res。push(arr[i]);

}

}

return res。join(“”);

}

removeRepeat(str);

11 。

var str=“aacccbbeeeddd”;

var sum=[];

var res=[];

var count=0;

var arr=str。split(“”);

for(var i=0;i

if(res。indexOf(arr[i])==-1){

res。push(arr[i]);

}

}

for(var i=0;i

for(var j=0;j

if(arr[j]==res[i]){

count++;

}

}

sum。push(count);

count=0;

}

console。log(res); //[“a”, “c”, “b”, “e”, “d”]

for(var i=0;i

var str=(sum[i]%2==0)?“偶數”:“奇數”;

console。log(res[i]+“出現了”+sum[i]+“次”);

console。log(res[i]+“出現了”+str+“次”);

}

```

閉包

```

閉包的形成與變數的作用域以及變數的生存週期有著密切的關係

##### 變數的作用域

1。全域性作用域 window

2。區域性作用域 每一個函式都是一個作用域

##### 作用域鏈

當前函式內沒有這個變數,那麼隨著程式碼執行環境的建立的作用域鏈逐層搜尋,一直到window層,找不到丟擲一個未定義錯誤,這種從內向外查詢的關係被稱之為作用域鏈。

變數的生存週期

全域性變數的生存週期是永久的,而函式的內部宣告的變數,退出函式是,變數會隨著函式的結束而銷燬,因此,JavaScript允許使用內部函式,

所以,我們可以透過函式巢狀一個函式,透過另一個函式來訪問這個函式的區域性變數,利用閉包突破作用域鏈,將函式內部的變數和方法傳遞到外部,延續變數的生命,減少全域性環境的汙染,延續變數的 生命。

使用場景,

模組化,不同模組擁有自己獨立的執行環境,不會與全域性衝突,模組與模組之間透過丟擲介面進行依賴使用。像是經常使用的jquery 。(避免全域性衝突使用閉包實現自己的獨立環境)

維持變數不被回收

缺點,

記憶體洩露(一塊被分配的記憶體既不能被使用,又不能回收,直到程序結束)

閉包使得函式的變數都儲存在記憶體之中,記憶體消耗加大,需要手動釋放

出現的原因: 循化引用,js閉包,dom洩露

閉包,原型鏈,繼承,作用域,排序方法

```