撩課-Web大前端每天5道面試題-Day16
阿新 • • 發佈:2018-12-24
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指定的資源。