每天看看面試題,鞏固知識,沖鴨
一 、寫出如下代碼的執(zhí)行結(jié)果
考察了 promise,以及任務(wù)處理順序。promise值得單寫一篇文章,這里不過多贅述。
new Promise((resolve) => {
console.log('1')
resolve()
console.log('2')
}).then(() => {
console.log('3')
})
setTimeout(() => {
console.log('4')
})
console.log('5')
- 首先需要搞清楚JS中是單線程的,并且執(zhí)行的優(yōu)先級是同步大于異步,并且是所有同步執(zhí)行完后才回來執(zhí)行異步操作
- 異步操作中又分為微任務(wù)(promise等)和宏任務(wù)(setTimeOut、I/O操作等)。顧名思義,微任務(wù)是具體的點,而宏任務(wù)是大的一個塊兒。
- 微任務(wù)和宏任務(wù)的執(zhí)行順序為前者優(yōu)先
所以,正確答案:1 2 5 3 4
二 、請列舉幾種除了px外的CSS度量單位并解釋其含義。
- rem 相對于根字體大小的單位,比如可以設(shè)置 1rem=50px
- em 相對于font-size,比如font-size:16px(瀏覽器默認),則2em=32px
- vm 即viewpoint width,視窗寬度,比如1vm的寬度為相對于視窗的寬度的百分之一
- vh 即viewpoint height ,同上
三 、new操作符做了什么?
考察原型和原型鏈,這個知識不在贅述
簡單點來說,new操作符會先創(chuàng)建一個空對象,然后將this指向這個空對象,并且進行賦值,最后返回這個this。
但是其中還涉及到了proto 、prototype,不過多贅述
四 、簡述cookie/session記住登錄狀態(tài)機制原理。
這里不寫答案,但是要知道cookie和session的作用。同時還要了解一下token。
五 、網(wǎng)頁中接收事件的順序(事件流)有哪些?它們之間的區(qū)別是什么?
首先說一下什么是事件流,個人理解為假設(shè)在??途W(wǎng)做題,當我點擊了提交按鈕,瀏覽器是如何知道我點擊了什么東西呢?這個時候就需要使用到事件流
最開始有兩種,一個是冒泡,一個是事件捕獲。
先說說冒泡:和冒泡排序一樣(雖然這是個憨批算法),都是從最底層開始,即那個點擊按鈕的標簽
假設(shè)這是個DOM,那么冒泡流就是從p開始,到div,然后body、html、document
html
head
body
div
p 提交
再來說說事件捕獲流:不用說太多,因為這剛好和上面是冒泡流相反,即從最外層的標簽開始,最后才到達p標簽。
最后來說說現(xiàn)在標準,DOM2級事件流,即首先進行事件捕獲流,然后到達事件所在的標簽后,進行處理,然后在開始進行事件冒泡流,類似于koa2中的洋蔥模型
六 、簡述你對HTTP控制訪問(CORS)的理解
首先要搞明白什么是同源,什么是跨域。
打一個簡單的比方,你自己從你家里拿東西,不會有人說,這是同源;但是你要從隔壁的鄰居的冰箱去拿可樂,你覺得可能嗎,這就是跨域。
從比方中回來,事實其實沒有那么簡單。理解了概念后,得知道如何去判斷同源還是跨域。web服務(wù)器有三要素:協(xié)議(http、https)、端口號(不過多說)、web服務(wù)器域名(比如https://github.com/mamba666
中https://github.com就是域名)。三要素必須全部一致才算同源
個人認為寫完上面的東東后已經(jīng)理解了同源跨域已經(jīng)如何區(qū)分。接下來就來看看真正的干貨,不講同源,只講跨域(以下參考MDN)
瀏覽器端
如果發(fā)現(xiàn)有一個請求是跨域,那么瀏覽器會自動先攔截一下,給它的http header加上Origin字段。比如 http://localhost:8080變?yōu)镺rigin:http://localhost:8080。這樣一來,服務(wù)器端就可以區(qū)分這個請求是不是跨域了。
服務(wù)器端
當服務(wù)器端收到瀏覽器端發(fā)送過來的請求后,會有一個響應(yīng)header。它會告訴請求的瀏覽器哪兒些域名可以請求我,哪兒些方法可以執(zhí)行。
響應(yīng)回到瀏覽器端
此時瀏覽器會根據(jù)這個響應(yīng)自動判斷,然后在做決定。
服務(wù)器端返回給瀏覽器端的東西
- Access-Control-Allow-Origin 允許跨域的Origin列表
- Access-Control-Allow-Methods 允許跨域的方法列表(GET、POST等)
- Access-Control-Allow-Headers 允許跨域的Header列表
- Access-Control-Expose-Headers 允許暴露給JavaScript代碼的Header列表
- Access-Control-Max-Age 最大的瀏覽器緩存時間,單位為s
跨域請求形式
有兩種,簡單和非簡單請求。這里說說我常遇到的 application/json 。這就是一種非簡單請求,在以上所寫的瀏覽器端之前,會先進行一次預(yù)請求,根據(jù)這個結(jié)果再去判斷是否正式請求。
其實寫了這么多,最重要的就是對CORS的理解,已經(jīng)這個流程是怎么樣的。