前面寫了一篇關於vue方面問題的面試題(面試時面試官想要聽到什麼答案(關於一些vue的問題)),感謝你們的閱讀和意見,今天整理了一下我面試時常常會問到的一些關於es的問題,寫了這篇文章,感謝撥冗翻閱拙做,敬請斧正。vue
由於最近比較忙es6的問題就寫了這些,寫的比較水了,這些也是我比較常問的還有一些比較碎的內容面試問了但本文未體現只挑選了重點的,class和symbol也是兩個重點,由於我瞭解不深因此就沒有去問這兩個 - -java
下面進入正文,本文會列舉一些平時面試時問到的問題和答案,並說明我在當時問到這個問題時所指望對方的回答:es6
經常使用的es6語法有哪些面試
做爲es6問題的開始的一個問題,想經過這個問題知道對方寫代碼時是否在用es6,是否知道本身用的是es6。可是大部分都說不上來幾個(其實忽然問我,我也不必定能說不少,固然面試多了以後就能夠隨口就來),因此我都懷疑這個問題有沒有問的必要,對方這個問題其實回答的多少我後面仍是該怎麼問仍是怎麼問,也並不影響這次面試。數組
說下var、let、const的區別promise
一個很是基礎的問題,基本都是回答的差很少,不過有時候會說var和let的區別爲一個沒有做用域一個有做用域,顯然這是一個誤區。const是常量這個都知道,可是他可變的狀況就不多有人清楚,阮一峯的《ECMAScript 6 入門》有詳細的說明。瀏覽器
補充:bash
塊級做用域爲 {} 只要被包裹在在{}中都是一個塊級做用域,好比:if、for、function、或者是直接只寫一個{}數據結構
const聲明一個只讀的常量。一旦聲明,常量的值就不能改變。異步
本質: const實際上保證的,並非變量的值不得改動,而是變量指向的那個內存地址所保存的數據不得改動。對於簡單類型的數據(數值、字符串、布爾值),值就保存在變量指向的那個內存地址,所以等同於常量。但對於複合類型的數據(主要是對象和數組),變量指向的內存地址,保存的只是一個指向實際數據的指針,const只能保證這個指針是固定的(即老是指向另外一個固定的地址),至於它指向的數據結構是否是可變的,就徹底不能控制了。所以,將一個對象聲明爲常量必須很是當心。
因此const聲明的對象、數組在對內部進行操做時是並不會報錯的,即const聲明的可變狀況。
塊級做用域對函數聲明有什麼影響或改變
這個問題我並無在面試中問過,由於這個問題其實很抽象並且很難去說明,並且這個環境問題就很難去模擬,下面是我在查閱了一些文檔和書以後的一些理解,若是有問題,敬請斧正。
阮一峯的《ECMAScript 6 入門》中let、const中有一節是對這一塊的描述。
ES5 規定,函數只能在頂層做用域和函數做用域之中聲明,不能在塊級做用域聲明。可是,瀏覽器沒有遵照這個規定,爲了兼容之前的舊代碼,仍是支持在塊級做用域之中聲明函數,不會報錯。
ES5環境下能夠實現下面代碼
demo() // 打印 bbb
var flag = true
if (flag) {
function demo() {
console.log('aaa')
}
} else {
function demo() {
console.log('bbb')
}
}
複製代碼
執行此代碼時,會先將函數聲明提高到頂部而並不會根據判斷在下面進行聲明,打印bbb是由於第一個聲明被第二個聲明覆蓋了(《你不知道的javaScript》第一部分第四章第三節),實際爲下面代碼:
function demo() {
console.log('aaa')
}
function demo() {
console.log('bbb')
}
var flag
demo() // 打印 bbb
flag = true
if (flag) {
} else {
}
複製代碼
ES6 引入了塊級做用域,明確容許在塊級做用域之中聲明函數。ES6規定,塊級做用域之中,函數聲明語句的行爲相似於let,在塊級做用域以外不可引用。
若是改變了塊級做用域內聲明的函數的處理規則,顯然會對老代碼產生很大影響。爲了減輕所以產生的不兼容問題,ES6 在附錄 B裏面規定,瀏覽器的實現能夠不遵照上面的規定,有本身的行爲方式。
注意,上面三條規則只對 ES6 的瀏覽器實現有效,其餘環境的實現不用遵照,仍是將塊級做用域的函數聲明看成let處理。
上面代碼的執行順序會變爲
var flag
var demo
demo() // demo is not a function
flag = true
if (flag) {
function demo() {
console.log('aaa')
}
} else {
function demo() {
console.log('bbb')
}
}
複製代碼
通常狀況這個問題我會給面試者出一個代碼題
console.log(1)
let promise = new Promise((resolve, reject) => {
console.log(2)
resolve()
console.log(3)
})
setTimeout(() => {
console.log(4)
}, 0);
console.log(5)
promise.then(() => {
console.log(6)
})
console.log(7)
複製代碼
正確執行順序我會放在指望答案的最後,防止在看題時看到結果。
這個問題主要問的是兩個關鍵點:1. promise在構造時內部就已經執行結束。2. promise.then和setTimeout的執行順序
關鍵點1:在Promise對象new的時候,Promise內部resolve先後就都執行了,resolve只與then有關(resolve調用時的參數爲then的參數),並不會阻止後面代碼的執行。
關鍵點2:promise.then的執行時間會早於setTimeout,promise和setTimeout均可以處理異步問題,promise爲微任務setTimeout爲宏任務,promise.then會在本次任務的最後的去調用,而setTimeout會開啓一個新的任務去執行其內部的內容,即下一次任務的開始。因此6比4先打印。
問題執行結果:1 2 3 5 7 6 4