1. 程式人生 > >撩課-Web大前端每天5道面試題-Day16

撩課-Web大前端每天5道面試題-Day16

1.for迴圈中的作用域問題?

寫出以下程式碼輸出值,嘗試用es5和es6的方式進行改進輸出迴圈中的i值。
for (var i=1; i<=5; i++) { 
    setTimeout(function timer() { 
       console.log(i); 
    }, i*1000); 
}

輸出5個6,因為回撥函式在for迴圈之後執行,所有函式共享一個i的引用。
es5:

for (var i=1; i<=5; i++) { 
    (function(j) { 
        setTimeout(function timer() { 
            console.log(j); 
        }, j
*1000); })(i); } es6: for (let i=1; i<=5; i++) { setTimeout(function timer() { console.log(i); }, i*1000); }

 

2.重繪和迴流?

重繪:當頁面中元素樣式的改變並不影響它在文件流中的位置時
(例如:color、background-color、visibility等),瀏覽器會將新樣式賦予給元素並重新繪製它,這個過程稱為重繪。
迴流:當Render Tree(DOM)中部分或全部元素的尺寸、結構、或某些屬性發生改變時,瀏覽器重新渲染部分或全部文件的過程稱為迴流。
迴流要比重繪消耗效能開支更大。
迴流必將引起重繪,重繪不一定會引起迴流。

 

3.原型及原型鏈?

原型的理解:

  所有的引用型別(陣列、物件、函式),都具有物件特性,即可自由擴充套件屬性(null除外)
  所有的引用型別(陣列、物件、函式),都有一個__proto__屬性,屬性值是一個普通的物件
  所有的函式,都有一個prototype屬性,屬性值也是一個普通的物件
  所有的引用型別(陣列、物件、函式),__proto__屬性值指向它的建構函式的prototype屬性值

原型鏈的理解
程式碼如下:
// 建構函式
function Foo(name, age) {
    this.name = name
}
Foo.prototype.alertName 
= function () { alert(this.name) } // 建立示例 var f = new Foo('zhangsan') f.printName = function () { console.log(this.name) } // 測試 f.printName() f.alertName() f.toString() 因為f本身沒有toString(),並且f.__proto__(即Foo.prototype)中也沒有toString。 當試圖得到一個物件的某個屬性時,如果這個物件本身沒有這個屬性,
那麼會去它的__proto__(即它的建構函式的prototype)中尋找。 如果在f.__proto__中沒有找到toString,那麼就繼續去f.__proto__.
__proto__中尋找,因為f.__proto__就是一個普通的物件而已嘛! f.__proto__即Foo.prototype,沒有找到toString,繼續往上找 f.__proto__.__proto__即Foo.prototype.__proto__。 Foo.prototype就是一個普通的物件,
因此Foo.prototype.__proto__就是Object.prototype,在這裡可以找到toString。 因此f.toString最終對應到了Object.prototype.toString 這樣一直往上找,你會發現是一個鏈式的結構,所以叫做“原型鏈”。 如果一直找到最上層都沒有找到,那麼就宣告失敗,返回undefined。
最上層是什麼 —— Object.prototype.__proto__
=== null

 

4.js浮點數運算精度問題(0.1+0.2!==0.3,比如在 JavaScript 中計算 0.1 + 0.2時,到底發生了什麼呢?

首先,十進位制的0.1和0.2都會被轉換成二進位制,但由於浮點數用二進位制表達時是無窮的,例如。
JavaScript 程式碼:
0.1 -> 0.0001100110011001...(無限)
0.2 -> 0.0011001100110011...(無限)
IEEE 754 標準的 64 位雙精度浮點數的小數部分最多支援 53 位二進位制位,所以兩者相加之後得到二進位制為:
JavaScript 程式碼:
0.0100110011001100110011001100110011001100110011001100
因浮點數小數位的限制而截斷的二進位制數字,再轉換為十進位制,
就成了 0.30000000000000004。所以在進行算術計算時會產生誤差。

 

5.說說HTTP method分別有哪些,他們各自做了哪些事情?

1.一臺伺服器要與HTTP1.1相容,只要為資源實現GET和HEAD方法即可。

2.GET是最常用的方法,通常用於請求伺服器傳送某個資源。

3.HEAD與GET類似,但伺服器在響應中值返回首部,不返回實體的主體部分。

4.PUT讓伺服器用請求的主體部分來建立一個由所請求的URL命名的新文件,
或者,如果那個URL已經存在的話,就用幹這個主體替代它。

5.POST起初是用來向伺服器輸入資料的。實際上,通常會用它來支援HTML的表單。
表單中填好的資料通常會被送給伺服器,然後由伺服器將其傳送到要去的地方。

6.TRACE會在目的伺服器端發起一個環回診斷,
最後一站的伺服器會彈回一個TRACE響應並在響應主體中攜帶它收到的原始請求報文。
TRACE方法主要用於診斷,用於驗證請求是否如願穿過了請求/響應鏈。

7.OPTIONS方法請求web伺服器告知其支援的各種功能。
可以查詢伺服器支援哪些方法或者對某些特殊資源支援哪些方法。

8.DELETE請求伺服器刪除請求URL指定的資源。