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'

 

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