前端面试题之 ES6

  1. ES6有哪些新特性?

    • 不一样的变量声明:const和let
    • 模板字符串( `` )
    • 箭头函数(Arrow Functions)
    • 函数的参数默认值(function xx(xxx = 'default') {})
    • 剩余运算符( ... )
    • 二进制和八进制字面量
      • ES6 支持二进制和八进制的字面量,通过在数字前面添加 0o 或者0O 即可将其转换为八进制值
    • 对象和数组解构
    • 允许在对象中使用 super()
    • for...of 和 for...in
      • for...of 用于遍历一个迭代器,如数组:
      • for...in 用来遍历对象中的属性
    • 支持 class 语法
      • 不过,ES6的class不是新的对象继承模型,它只是原型链的语法糖表现形式
      • 函数中使用 static 关键词定义构造函数的的方法和属性
      • 类中的继承和超集
  2. 谈谈对 Promise 的理解。

    1. Promise 是什么?

      • Promise 是最早由社区提出和实现的一种解决异步编程的方案,比其他传统的解决方案(回调函数和事件)更合理和更强大
      • ES6 将其写进了语言标准,统一了用法,原生提供了 Promise 对象
      • ES6 规定,Promise 对象是一个构造函数,用来生成 Promise 实例
    2. Promise 是为解决什么问题而产生的?

      • Promise 是为解决异步处理回调金字塔问题而产生的
    3. Promise 的两个特点

      • Promise 对象的状态不受外界影响
        • Promise 有三种状态,只有异步操作的结果可以决定当前是哪一种状态,其他任何操作都无法改变这个状态
          • pending 初始状态
          • fulfilled 成功状态
          • rejected 失败状态
      • Promise 的状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆,只能由 pending 变成 fulfilled 或者由 pending 变成 rejected
    4. Promise的三个缺点

      • 无法取消Promise,一旦新建它就会立即执行,无法中途取消
      • 如果不设置回调函数,Promise内部抛出的错误,不会反映到外部
      • 当处于pending状态时,无法得知目前进展到哪一个阶段,是刚刚开始还是即将完成
    5. Promise在哪存放成功回调序列和失败回调序列?

      • onResolvedCallbacks 成功后要执行的回调序列 是一个数组
      • onRejectedCallbacks 失败后要执行的回调序列 是一个数组
      • 以上两个数组存放在Promise 创建实例时给Promise这个类传的函数中,默认都是空数组
      • 每次实例 then 的时候 传入 onFulfilled 成功回调 onRejected 失败回调,如果此时的状态是 pending 则将 onFulfilled 和 onRejected push 到对应的成功回调序列数组和失败回调序列数组中,如果此时的状态是 fulfilled 则 onFulfilled 立即执行,如果此时的状态是 rejected 则 onRejected 立即执行
      • 上述序列中的回调函数执行的时候 是有顺序的,即按照顺序依次执行
    6. Promise的用法

      • Promise 构造函数接受一个函数作为参数,该函数的两个参数分别是 resolve 和 reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署
      •   const promise = new Promise(function(resolve, reject) {
              // ... some code
              if (/* 异步操作成功 */){
                  resolve(value);
              } else {
                  reject(error);
              }
          });
        
      • resolve 函数的作用是:将 Promise 对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject 函数的作用是,将 Promise 对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
      • Promise 实例生成以后,可以用then方法分别指定 resolved 状态和 rejected 状态的回调函数
      •   promise.then(function(value) {
              // success
          }, function(error) {
              // failure
          });
        
      • then 方法可以接受两个回调函数作为参数。第一个回调函数是 Promise 对象的状态变为 resolved 时调用,第二个回调函数是 Promise 对象的状态变为 rejected 时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受 Promise 对象传出的值作为参数。
    7. Promise 链式写法

      • 第一个 promise 不管成功回调还是失败回调,他的返回值作为第二个 promise 中的成功时回调函数的参数值
      • 链式写法能一直 then 下去的原因:链式调用靠的是返回新的 promise,来保证可以一直走成功或失败
    8. Promise.catch

      • Promise.prototype.catch方法是.then(null, rejection) 的别名,用于指定发生错误时的回调函数
      •   //catch 原理就是只传失败的回调
          Promise.prototype.catch = function(onRejected){
              this.then(null,onRejected);
          }    
        
    9. Promise.all 方法

      • 参数:接受一个数组,数组内都是 Promise 实例
      • 返回值:返回一个 Promise 实例,这个 Promise 实例的状态转移取决于参数的 Promise 实例的状态变化。当参数中所有的实例都处于 resolve 状态时,返回的 Promise 实例会变为 resolve 状态。如果参数中任意一个实例处于 reject 状态,返回的 Promise 实例变为 reject 状态
      •   Promise.all = function(promises){
              return new Promise(function(resolve,reject){
                  let done = gen(promises.length,resolve);
                  for(let i=0;i
    10. Promise.resolve

      • 返回一个 Promise 实例,这个实例处于 resolve 状态
      • 根据传入的参数不同有不同的功能:
        • 值(对象、数组、字符串等):作为 resolve 传递出去的值
        • Promise 实例:原封不动返回
      •   //返回一个立刻成功的 promise
          //别人提供 给你一个方法,需要你传入一个promise,但你只有一个普通的值,你就可以通过这个方法把这个普通的值(string number object)转成一个promise对象
          Promise.resolve = function(value){
              return new Promise(function(resolve){
                  resolve(value);
              });
          }
        
    11. Promise.reject

      • 返回一个 Promise 实例,这个实例处于 reject 状态
      • 参数一般就是抛出的错误信息
      •   //返回一个立刻失败的 promise
          Promise.reject = function(reason){
              return new Promise(function(resolve,reject){
                  reject(reason);
                });
          }
        
    12. Promise.race

      • 参数:接受一个数组,数组内都是 Promise 实例
      • 返回值:返回一个 Promise 实例,这个 Promise 实例的状态转移取决于参数的 Promise 实例的状态变化。当参数中任何一个实例处于 resolve 状态时,返回的 Promise 实例会变为 resolve 状态。如果参数中任意一个实例处于 reject 状态,返回的 Promise 实例变为 reject 状态
      •   Promise.race = function(promises){
              return new Promise(function(resolve,reject){
                  for(let i=0;i
  3. 谈谈letconstvar 的区别。

    • var 与 let/const 的区别
      • 块级作用域
      • 不存在变量提升
      • 暂时性死区
      • 不可重复声明
      • let、const 声明的全局变量不会挂在顶层对象下面
    • const 注意点
      • const 声明之后必须马上赋值,否则会报错
      • const 简单类型一旦声明就不能再更改,复杂类型(数组、对象等)指针指向的地址不能更改,内部数据可以更改
  4. setTimeoutPromiseAsync/Await 的区别。

    • 谈谈 Event Loop
      • setTimeout 是一个 macro(宏) 任务
      • promise、和 await 后续为 micro(微) 任务
      • 所以在执行顺序上会先进行同步代码,再者 Promise、Async/Await,最后才是 setTimeout
    • Promise、Async/Await差异
      • promise 是 resolve 为异步方法,将放入微任务队里里执行,但是 resolve 前后的正常代码为同步代码;Async/Await 会返回一个 promise,await 的顺序是从右往左的,也就是说await 右边的方法也优先执行同步代码,再让出线程,进入微任务队列,await下面的代码可以理解为 promise then 里面的代码

你可能感兴趣的:(前端面试题之 ES6)