1.for循環(huán)中的作用域問題?
寫出以下代碼輸出值顾彰,嘗試用es5和es6的方式進行改進輸出循環(huán)中的i值捅膘。
for (var i=1; i<=5; i++) {
setTimeout(function timer() {
console.log(i);
}, i*1000);
}
輸出5個6,因為回調(diào)函數(shù)在for循環(huán)之后執(zhí)行扫责,所有函數(shù)共享一個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)中部分或全部元素的尺寸、結構番捂、或某些屬性發(fā)生改變時个唧,瀏覽器重新渲染部分或全部文檔的過程稱為回流。
回流要比重繪消耗性能開支更大设预。
回流必將引起重繪徙歼,重繪不一定會引起回流。
3.原型及原型鏈?
原型的理解:
所有的引用類型(數(shù)組絮缅、對象鲁沥、函數(shù))呼股,都具有對象特性耕魄,即可自由擴展屬性(null除外)
所有的引用類型(數(shù)組、對象彭谁、函數(shù))吸奴,都有一個__proto__屬性,屬性值是一個普通的對象
所有的函數(shù),都有一個prototype屬性则奥,屬性值也是一個普通的對象
所有的引用類型(數(shù)組考润、對象、函數(shù))读处,__proto__屬性值指向它的構造函數(shù)的prototype屬性值
原型鏈的理解
代碼如下:
// 構造函數(shù)
function Foo(name, age) {
this.name = name
}
Foo.prototype.alertName = function () {
alert(this.name)
}
// 創(chuàng)建示例
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__(即它的構造函數(shù)的prototype)中尋找。
如果在f.__proto__中沒有找到toString管闷,那么就繼續(xù)去f.__proto__.__proto__中尋找粥脚,因為f.__proto__就是一個普通的對象而已嘛!
f.__proto__即Foo.prototype包个,沒有找到toString刷允,繼續(xù)往上找
f.__proto__.__proto__即Foo.prototype.__proto__。
Foo.prototype就是一個普通的對象碧囊,因此Foo.prototype.__proto__就是Object.prototype树灶,在這里可以找到toString。
因此f.toString最終對應到了Object.prototype.toString
這樣一直往上找糯而,你會發(fā)現(xiàn)是一個鏈式的結構破托,所以叫做“原型鏈”。
如果一直找到最上層都沒有找到歧蒋,那么就宣告失敗土砂,返回undefined。最上層是什么 —— Object.prototype.__proto__ === null
4.js浮點數(shù)運算精度問題(0.1+0.2!==0.3,比如在 JavaScript 中計算 0.1 + 0.2時谜洽,到底發(fā)生了什么呢萝映?
首先,十進制的0.1和0.2都會被轉換成二進制阐虚,但由于浮點數(shù)用二進制表達時是無窮的序臂,例如。
JavaScript 代碼:
0.1 -> 0.0001100110011001...(無限)
0.2 -> 0.0011001100110011...(無限)
IEEE 754 標準的 64 位雙精度浮點數(shù)的小數(shù)部分最多支持 53 位二進制位实束,所以兩者相加之后得到二進制為:
JavaScript 代碼:
0.0100110011001100110011001100110011001100110011001100
因浮點數(shù)小數(shù)位的限制而截斷的二進制數(shù)字奥秆,再轉換為十進制,就成了 0.30000000000000004咸灿。所以在進行算術計算時會產(chǎn)生誤差构订。
5.說說HTTP method分別有哪些,他們各自做了哪些事情?
1.一臺服務器要與HTTP1.1兼容,只要為資源實現(xiàn)GET和HEAD方法即可避矢。
2.GET是最常用的方法悼瘾,通常用于請求服務器發(fā)送某個資源囊榜。
3.HEAD與GET類似,但服務器在響應中值返回首部亥宿,不返回實體的主體部分卸勺。
4.PUT讓服務器用請求的主體部分來創(chuàng)建一個由所請求的URL命名的新文檔,
或者烫扼,如果那個URL已經(jīng)存在的話曙求,就用干這個主體替代它。
5.POST起初是用來向服務器輸入數(shù)據(jù)的映企。實際上圆到,通常會用它來支持HTML的表單。
表單中填好的數(shù)據(jù)通常會被送給服務器卑吭,然后由服務器將其發(fā)送到要去的地方芽淡。
6.TRACE會在目的服務器端發(fā)起一個環(huán)回診斷,
最后一站的服務器會彈回一個TRACE響應并在響應主體中攜帶它收到的原始請求報文豆赏。
TRACE方法主要用于診斷挣菲,用于驗證請求是否如愿穿過了請求/響應鏈。
7.OPTIONS方法請求web服務器告知其支持的各種功能掷邦。
可以查詢服務器支持哪些方法或者對某些特殊資源支持哪些方法白胀。
8.DELETE請求服務器刪除請求URL指定的資源。