1.for of和for in區(qū)別
for in: 一般用于遍歷對(duì)象的可枚舉屬性乐设。以及對(duì)象從構(gòu)造函數(shù)原型中繼承的屬性。對(duì)于每個(gè)不同的屬性断凶,語(yǔ)句都會(huì)被執(zhí)行伤提。
- 使用for in會(huì)遍歷數(shù)組所有的可枚舉屬性,包括原型认烁。例如原型方法method和name屬性肿男。
- for in遍歷的是數(shù)組的索引(即鍵名)介汹,而for of遍歷的是數(shù)組元素值。
- for of遍歷的只是數(shù)組內(nèi)的元素舶沛,而不包括數(shù)組的原型屬性method和索引name
for..of適用遍歷數(shù)/數(shù)組對(duì)象/字符串/map/set等擁有Symbol.iterator 屬性的數(shù)據(jù).但是不能遍歷對(duì)象,因?yàn)椴痪哂?iterator接口,
事件模型
- 事件捕獲和事件冒泡
- 事件冒泡:事件會(huì)從最內(nèi)層的元素開始發(fā)生嘹承,一直向上傳播,直到document對(duì)象如庭。
事件捕獲:事件從最外層開始發(fā)生叹卷,直到最具體的元素。 - 通過(guò)addEventerListener()的第三個(gè)參數(shù)來(lái)設(shè)置事件是通過(guò)捕獲階段注冊(cè)的(true),還是冒泡階段注冊(cè)的(false),默認(rèn)情況下是false坪它。
- e.stopPropagation() e.preventDefault()
漸進(jìn)增強(qiáng)骤竹、優(yōu)雅降級(jí)(向上兼容和向下兼容)
- 漸進(jìn)增強(qiáng)(Progressive Enhancement):一開始就針對(duì)低版本瀏覽器進(jìn)行構(gòu)建頁(yè)面,完成基本的功能往毡,然后再針對(duì)高級(jí)瀏覽器進(jìn)行效果蒙揣、交互、追加功能達(dá)到更好的體驗(yàn)开瞭。
優(yōu)雅降級(jí)(Graceful Degradation):一開始就構(gòu)建站點(diǎn)的完整功能懒震,然后針對(duì)瀏覽器測(cè)試和修復(fù)。比如一開始使用 CSS3 的特性構(gòu)建了一個(gè)應(yīng)用嗤详,然后逐步針對(duì)各大瀏覽器進(jìn)行 hack 使其可以在低版本瀏覽器上正常瀏覽个扰。
js異步加載
js默認(rèn)加載是同步加載(阻塞加載),會(huì)影響后續(xù)頁(yè)面渲染葱色。
- defer s腳本在所有元素加載完成后執(zhí)行递宅,而且是按照js腳本聲明的順序執(zhí)行
- async sync只適用于外部引用的腳本,js腳本是亂序執(zhí)行的冬筒,不管你聲明的順序如何恐锣,只要某個(gè)js腳本加載完就立即執(zhí)行。
- 動(dòng)態(tài)生成script標(biāo)簽舞痰,在js里創(chuàng)建script標(biāo)簽,插入DOM中诀姚,加載完成后callback响牛,所有的js腳本都會(huì)在onload事件后才加載
this問(wèn)題(根據(jù)執(zhí)行上下文理解)
this指向執(zhí)行環(huán)境
- 默認(rèn)綁定時(shí)this指向全局對(duì)象,在嚴(yán)格模式環(huán)境中赫段,默認(rèn)綁定的this指向undefined
- 如果函數(shù)調(diào)用前存在多個(gè)對(duì)象呀打,this指向距離調(diào)用自己最近的對(duì)象
- 通過(guò)call、apply以及bind方法改變this的行為
- 箭頭函數(shù)的this指向取決于外層作用域中的this糯笙,外層作用域或函數(shù)的this指向誰(shuí)贬丛,箭頭函數(shù)中的this便指向誰(shuí)
執(zhí)行上下文
- JS執(zhí)行上下文的創(chuàng)建階段主要負(fù)責(zé)三件事:確定this---創(chuàng)建詞法環(huán)境組件---創(chuàng)建變量環(huán)境組件(this,作用域與變量對(duì)象)
- 詞法環(huán)境由環(huán)境記錄與對(duì)外部環(huán)境引入記錄(變量對(duì)象给涕,作用域鏈)
- 詞法環(huán)境用于存儲(chǔ)函數(shù)聲明與let const聲明的變量豺憔,而變量環(huán)境僅僅存儲(chǔ)var聲明的變量额获。
- 在執(zhí)行上下文創(chuàng)建階段,函數(shù)聲明與var聲明的變量在創(chuàng)建階段已經(jīng)被賦予了一個(gè)值恭应,var聲明被設(shè)置為了undefined抄邀,函數(shù)被設(shè)置為了自身函數(shù),而let const被設(shè)置為未初始化昼榛。(變量提升與函數(shù)聲明提前)
- 變量對(duì)象是與執(zhí)行上下文相關(guān)的數(shù)據(jù)作用域境肾,存儲(chǔ)了在上下文中定義的變量和函數(shù)聲明。而在函數(shù)上下文中胆屿,我們用活動(dòng)對(duì)象(activation object, AO)來(lái)表示變量對(duì)象奥喻。
fetch
首先f(wàn)etch是原生js的實(shí)現(xiàn)方案,與ajax并無(wú)關(guān)系非迹,你可以把它當(dāng)成XMLHttpRequest的一種更理想的替代方案环鲤,
ajax對(duì)比,fetch主要有三點(diǎn)不同:
- 當(dāng)接收一個(gè)表示錯(cuò)誤的http狀態(tài)碼時(shí)彻秆,fetch的promise不會(huì)被標(biāo)記為rejecte楔绞,反而是resolve(但是會(huì)將resolve的ok屬性設(shè)為false),只有網(wǎng)絡(luò)故障唇兑,請(qǐng)求被阻止這種情況才會(huì)被標(biāo)記reject酒朵。
- fetch可以接受跨域cookies,你也可以使用fetch創(chuàng)建跨域請(qǐng)求扎附。
- fetch默認(rèn)不會(huì)發(fā)送cookies蔫耽,除非我們通過(guò)前面的init對(duì)象修改了初始化配置。