ES6、7面試題

let、const、var的區別?

  • let 和 const聲明的變量不會出現提升,var聲明的變量會出現提升(另外一種說法:let變量也會提升,只不過因爲暫時性的限制,不能再let聲明變量之前使用)
  • let 和 const是塊級作用域,var是函數級作用域
  • let 和 const不允許重複聲明(會拋出錯誤)
  • let 和 const聲明變量之前使用,會拋出錯誤(暫時性死區)
  • const 聲明一個只讀的常量,一旦聲明,不可以改變

 

 

Promise是什麼?

定義:

Promise 是異步編程的一種解決方案

Promise 本身是同步立即執行函數,.then 是異步的

特點:

  1. 對象的狀態不受外界影響
  2. 一旦狀態改變就不會再變

三個狀態:

pending(等待)、fulfilled(成功)、rejected(失敗)

兩個過程:

resolve 函數被執行時,會從pending 變成 fulfilled 成功

rejecte 函數被執行時,會從pending 變成 rejected 失敗

 

 Promise的靜態方法?

  • Promise.resolve()
  • Promise.reject()
  • Promise.all([promise1, promise2, promise3]) 是在所有promise都完成後執行。可以用於處理一些併發的任務 

 

async / await 是什麼?

從內部實現來說其實就是Generator的語法糖,基於Promise,並於所有現存的基於Promise的API兼容

async關鍵字

  • async 關鍵字用於聲明一個異步函數(如 async function test(){...})
  • async 會自動將常規函數轉換成Promise,返回值也是一個Promise對象

await 關鍵字

  • await 用於等待異步功能執行完畢 (如 let res = await test())
  • await 只能再 async 函數內部使用
  • await 只能用與Promise 一起調用,await放置在Promise調用之前,會強制async函數中其他異步代碼等待,直到Promise完成並返回結果

 

相較於Promise,async / await有何優勢?

  • 代碼清晰,提升了代碼的閱讀體驗 (promise雖然擺脫了回調地獄,但then鏈式調用的閱讀負擔還是存在的)
  • 可以使用try / catch 進行錯誤處理(async / await 可以用成熟的try / catch做處理)
  • 調式時的閱讀性,也相對更友好(調用多個Promise,Promise鏈中某個地方拋出錯誤,不會給出錯誤發生的位置,不能在.then代碼塊中設置斷點)

缺點:try..catch內部的變量無法傳遞給下一個try...catch

箭頭函數和普通函數的區別?

  • 箭頭函數作爲匿名函數,不能使用new 關鍵字
  • 箭頭函數不綁定this ,會捕獲上下文this,作爲自己的this值,任何方法都改變不了this指向,(call(),bind(),apply())
  • 箭頭函數不綁定arguments,用rest參數替代

普通函數:可以使用arguments,也可以使用rest

function showArgs(a,b,c){
  console.log(arguments[2]) // 3
}
showArgs(1,2,3)

 箭頭函數:不綁定arguments,es6引入rest參數(形式爲...變量名

let showArgs = (...args) => {
  console.log(args)
}
showArgs(1,2,3,4,5)

exports, module.exports, export defaul 區別?

  • exports:導出的是模塊函數本身,可以有多個

    exports.func = function () {}

    引入(需要加括號):import {func} from './test'

  • module.exports:導出的是模塊對象本身,當文件中出現多個,後面的module.exports會覆蓋以前的

    module.exports = { func: function () {} }

    引入(可加可不加,不加就是引入模塊對象本身):import module from './test'

  • export default:只能有一個

    export default function func() {console.log(1)}

    引入(不用加括號):import func from './test'

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章