前端的十個問題,你知道幾個?
01、null和undefined
undefined是全局對象的一個屬性,當(dāng)一個變量沒有賦值或者訪問一個對象不存在的屬性,這時候都是undefined。
null:表示是一個空對象。在需要釋放一個對象的時候,直接賦值為null即可。
02、箭頭函數(shù)
箭頭函數(shù)是ES6新增的,簡化函數(shù)的定義。箭頭函數(shù)沒有自身的this,所以this是從外部獲取的,也就是繼承了外部的執(zhí)行上下文。
箭頭函數(shù)不能作為構(gòu)造函數(shù),如果通過call()或者apply()調(diào)用箭頭函數(shù)的時候,不需要綁定this,直接傳入?yún)?shù)即可。
03、call、apply和bind的作用
bind、call和apply都是改變函數(shù)this的指向。 bind在改變this的時候,返回的是一個改變執(zhí)行上下文的函數(shù),不會立即執(zhí)行。 call和apply在改變this指向同時也執(zhí)行該函數(shù)。 bind只有一個參數(shù),call和apply可接收多個參數(shù),第一個參數(shù)是this的指向。apply的第二參數(shù)是一個數(shù)組。
04、函數(shù)的this
this是函數(shù)的執(zhí)行上下文,分為全局執(zhí)行上下文和函數(shù)執(zhí)行上下文。
this在嚴格模式下,指向的是undefined,非嚴格模式下默認指向window。
函數(shù)的this,在函數(shù)被調(diào)用的時候,指向的是函數(shù)的調(diào)用者,也就是誰調(diào)用,就指向誰。
如果通過new 構(gòu)造函數(shù)創(chuàng)建一個新的對象,那么構(gòu)造函數(shù)的中的this指向新對象本身。
普通函數(shù)不繼承this,箭頭函數(shù)沒有this,它是繼承外部的this。
05、變量提升
變量提升是指js的變量和函數(shù)在編譯的時候提升到最前面。
造成變量提升的現(xiàn)象,是因為使用var關(guān)鍵字聲明的變量,變量提升的時候,只有聲明在提升,變量賦值并沒有提升,在變量初始化之前訪問該變量,就會返回undefined。使用let或者const聲明變量,就形成暫時性死區(qū),在let或者const聲明變量之前訪問變量會報錯。
06、map和forEach的區(qū)別
map有返回值,可以開辟新的空間,return返回一個長度和原數(shù)組長度一樣的新數(shù)組。
forEach函數(shù)沒有返回值,返回的undefined。
map的處理速度比forEach快,返回新數(shù)組,這樣方便鏈式調(diào)用其他數(shù)組方法,比如filter、reduce等等。
07、怎么理解事件循環(huán)、微任務(wù)和宏任務(wù)
瀏覽器的事件循環(huán)是執(zhí)行js代碼的時候,遇見同步任務(wù),直接推進調(diào)用棧中執(zhí)行,遇到異步任務(wù)時候,將異步任務(wù)掛起,等到異步任務(wù)有返回之后再推到任務(wù)隊列中。
當(dāng)調(diào)用棧中所有的同步任務(wù)執(zhí)行完成,將任務(wù)隊列中的任務(wù)按照順序執(zhí)行。重復(fù)執(zhí)行這一系列的行為就是事件循環(huán)。
異步任務(wù)又分為宏任務(wù)和微任務(wù)。宏任務(wù)就是任務(wù)隊列中的任務(wù),每一個宏任務(wù)中包含一個微任務(wù)隊列;
微任務(wù):就是等宏任務(wù)中的主要功能執(zhí)行完成后,渲染引擎并沒有立即執(zhí)行下一個宏任務(wù),而是執(zhí)行當(dāng)前宏任務(wù)中的微任務(wù)。
宏任務(wù)包含:script標簽內(nèi)的代碼、定時器、Ajax請求
微任務(wù):Promise
08、跨站點請求偽造CSRF
攻擊者盜用用戶的身份,以用戶的身份發(fā)起惡意請求。但是對于服務(wù)器來說,這個請求是合理的。
預(yù)防CSR攻擊方法:
- 使用驗證碼,強烈要求用戶和應(yīng)用進行交互
- 在http中referer字段,檢查是否是從正確的域名訪問過來,它記錄了http請求的來源地址
- 使用token驗證,在http請求頭中添加token字段,在服務(wù)器端設(shè)置一個攔截器來驗證token,如果token無效,那么拒絕訪問
09、XSS攻擊
XSS攻擊是腳本攻擊,攻擊者通過向web頁面插入script代碼,在用戶瀏覽這個頁面時候,執(zhí)行script的腳本代碼,達到攻擊的目的。
預(yù)防:對數(shù)據(jù)進行嚴格的輸出編碼,比如URL編碼、css編碼、JavaScript編碼。
10、瀏覽器如何渲染頁面的
瀏覽器從服務(wù)器獲取到html后,將html轉(zhuǎn)化為DOM樹,再將css樣式轉(zhuǎn)化為對應(yīng)的stylesheet,根據(jù)DOM樹和stylesheet繪制成頁面。