let、const、var的區別?
- let 和 const聲明的變量不會出現提升,var聲明的變量會出現提升(另外一種說法:let變量也會提升,只不過因爲暫時性的限制,不能再let聲明變量之前使用)
- let 和 const是塊級作用域,var是函數級作用域
- let 和 const不允許重複聲明(會拋出錯誤)
- let 和 const聲明變量之前使用,會拋出錯誤(暫時性死區)
- const 聲明一個只讀的常量,一旦聲明,不可以改變
Promise是什麼?
定義:
Promise
是異步編程的一種解決方案
Promise
本身是同步立即執行函數,.then 是異步的
特點:
- 對象的狀態不受外界影響
- 一旦狀態改變就不會再變
三個狀態:
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'