-
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 关键词定义构造函数的的方法和属性
- 类中的继承和超集
-
谈谈对
Promise
的理解。-
Promise 是什么?
- Promise 是最早由社区提出和实现的一种解决异步编程的方案,比其他传统的解决方案(回调函数和事件)更合理和更强大
- ES6 将其写进了语言标准,统一了用法,原生提供了 Promise 对象
- ES6 规定,Promise 对象是一个构造函数,用来生成 Promise 实例
-
Promise 是为解决什么问题而产生的?
- Promise 是为解决异步处理回调金字塔问题而产生的
-
Promise 的两个特点
- Promise 对象的状态不受外界影响
- Promise 有三种状态,只有异步操作的结果可以决定当前是哪一种状态,其他任何操作都无法改变这个状态
- pending 初始状态
- fulfilled 成功状态
- rejected 失败状态
- Promise 有三种状态,只有异步操作的结果可以决定当前是哪一种状态,其他任何操作都无法改变这个状态
- Promise 的状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆,只能由 pending 变成 fulfilled 或者由 pending 变成 rejected
- Promise 对象的状态不受外界影响
-
Promise的三个缺点
- 无法取消Promise,一旦新建它就会立即执行,无法中途取消
- 如果不设置回调函数,Promise内部抛出的错误,不会反映到外部
- 当处于pending状态时,无法得知目前进展到哪一个阶段,是刚刚开始还是即将完成
-
Promise在哪存放成功回调序列和失败回调序列?
- onResolvedCallbacks 成功后要执行的回调序列 是一个数组
- onRejectedCallbacks 失败后要执行的回调序列 是一个数组
- 以上两个数组存放在Promise 创建实例时给Promise这个类传的函数中,默认都是空数组
- 每次实例 then 的时候 传入 onFulfilled 成功回调 onRejected 失败回调,如果此时的状态是 pending 则将 onFulfilled 和 onRejected push 到对应的成功回调序列数组和失败回调序列数组中,如果此时的状态是 fulfilled 则 onFulfilled 立即执行,如果此时的状态是 rejected 则 onRejected 立即执行
- 上述序列中的回调函数执行的时候 是有顺序的,即按照顺序依次执行
-
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 对象传出的值作为参数。
-
Promise 链式写法
- 第一个 promise 不管成功回调还是失败回调,他的返回值作为第二个 promise 中的成功时回调函数的参数值
- 链式写法能一直 then 下去的原因:链式调用靠的是返回新的 promise,来保证可以一直走成功或失败
-
Promise.catch
- Promise.prototype.catch方法是.then(null, rejection) 的别名,用于指定发生错误时的回调函数
//catch 原理就是只传失败的回调 Promise.prototype.catch = function(onRejected){ this.then(null,onRejected); }
-
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<promises.length;i++){ promises[i].then(function(data){ done(i,data); },reject); } }); }
-
Promise.resolve
- 返回一个 Promise 实例,这个实例处于 resolve 状态
- 根据传入的参数不同有不同的功能:
- 值(对象、数组、字符串等):作为 resolve 传递出去的值
- Promise 实例:原封不动返回
//返回一个立刻成功的 promise //别人提供 给你一个方法,需要你传入一个promise,但你只有一个普通的值,你就可以通过这个方法把这个普通的值(string number object)转成一个promise对象 Promise.resolve = function(value){ return new Promise(function(resolve){ resolve(value); }); }
-
Promise.reject
- 返回一个 Promise 实例,这个实例处于 reject 状态
- 参数一般就是抛出的错误信息
//返回一个立刻失败的 promise Promise.reject = function(reason){ return new Promise(function(resolve,reject){ reject(reason); }); }
-
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<promises.length;i++){ promises[i].then(resolve,reject); } }); }
-
-
谈谈
let
、const
与var
的区别。- var 与 let/const 的区别
- 块级作用域
- 不存在变量提升
- 暂时性死区
- 不可重复声明
- let、const 声明的全局变量不会挂在顶层对象下面
- const 注意点
- const 声明之后必须马上赋值,否则会报错
- const 简单类型一旦声明就不能再更改,复杂类型(数组、对象等)指针指向的地址不能更改,内部数据可以更改
- var 与 let/const 的区别
-
setTimeout
、Promise
、Async/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 里面的代码
- 谈谈 Event Loop
前端面试题之 ES6
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 前言 本文旨在简单讲解一下javascript中的Promise对象的概念,特性与简单的使用方法。并在文末会附上一...
- 你不知道JS:异步 第三章:Promises 接上篇3-1 错误处理(Error Handling) 在异步编程中...
- 你不知道JS:异步 第三章:Promises 在第二章,我们指出了采用回调来表达异步和管理并发时的两种主要不足:缺...