let const 的命令
在 ES6 之前,声明变量只能用 var,var 方式声明变量其实是很不合理的,准确的说,是因为 ES5 里面没有块级作用域是很不合理的,甚至可以说是一个语言层面的 bug(这也是很多 c ++、java 开发人员看不懂,也瞧不起 JS 语言的劣势之一)。没有块级作用域回来带很多难以理解的问题,比如 for 循环 var 变量泄露,变量覆盖等问题。let 声明的变量拥有自己的块级作用域,且修复了 var 声明变量带来的变量提升问题。
箭头函数
当要求动态上下文的时候,就不能够使用箭头函数。也就是 this 的固定化
1、在使用 => 定义函数的时候,this 的指向是定义时所在的对象,而不是使用时所在的对象
2、不能够用作构造函数,这就是说,不能够使用 new 命令,否则就会抛出一个错误
3、不能够使用 arguments 对象
4、不能使用 yield 命令
这是一道当年很困惑我的一道题不知道你在第一眼能不能看出其结果,this 的指向总是让人困扰,但是有了 => 以后妈妈再也不用担心你使用 this 了
Set 是什么,有什么作用?
Set 是 ES6 引入的一种类似 Array 的新的数据结构,Set 实例的成员类似于数组 item 成员,区别是 Set 实例的成员都是唯一,不重复的。这个特性可以轻松地实现数组去重。
Map 是什么,有什么作用?
Map 是 ES6 引入的一种类似 Object 的新的数据结构,Map 可以理解为是 Object 的超集,打破了以传统键值对形式定义对象,对象的 key 不再局限于字符串,也可以是 Object。可以更加全面的描述对象的属性。
Proxy 是什么,有什么作用?
Proxy 是 ES6 新增的一个构造函数,可以理解为 JS 语言的一个代理,用来改变 JS 默认的一些语言行为,包括拦截默认的 get/set 等底层方法,使得 JS 的使用自由度更高,可以最大限度的满足开发者的需求。比如通过拦截对象的 get/set 方法,可以轻松地定制自己想要的 key 或者 value。下面的例子可以看到,随便定义一个 myOwnObj 的 key, 都可以变成自己想要的函数。
Reflect 是什么,有什么作用?
Reflect 是 ES6 引入的一个新的对象,他的主要作用有两点,一是将原生的一些零散分布在 Object、Function 或者全局函数里的方法(如 apply、delete、get、set 等等),统一整合到 Reflect 上,这样可以更加方便更加统一的管理一些原生 API。其次就是因为 Proxy 可以改写默认的原生 API,如果一旦原生 API 别改写可能就找不到了,所以 Reflect 也可以起到备份原生 API 的作用,使得即使原生 API 被改写了之后,也可以在被改写之后的 API 用上默认的 API。
Iterator 是什么,有什么作用?
Iterator 是 ES6 中一个很重要概念,它并不是对象,也不是任何一种数据类型。因为 ES6 新增了 Set、Map 类型,他们和 Array、Object 类型很像,Array、Object 都是可以遍历的,但是 Set、Map 都不能用 for 循环遍历,解决这个问题有两种方案,一种是为 Set、Map 单独新增一个用来遍历的 API,另一种是为 Set、Map、Array、Object 新增一个统一的遍历 API,显然,第二种更好,ES6 也就顺其自然的需要一种设计标准,来统一所有可遍历类型的遍历方式。Iterator 正是这样一种标准。或者说是一种规范理念。
就好像 JavaScript 是 ECMAScript 标准的一种具体实现一样,Iterator 标准的具体实现是 Iterator 遍历器。Iterator 标准规定,所有部署了 key 值为 [Symbol.iterator],且[Symbol.iterator] 的 value 是标准的 Iterator 接口函数 (标准的 Iterator 接口函数: 该函数必须返回一个对象,且对象中包含 next 方法,且执行 next() 能返回包含 value/done 属性的 Iterator 对象)的对象,都称之为可遍历对象,next()后返回的 Iterator 对象也就是 Iterator 遍历器。
ECMAScript 6 怎么写 class,为何会出现 class?
ES6 的 class 可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的 class 写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。
// 定义类
class Point {
constructor(x,y) {
// 构造方法
this.x = x; //this 关键字代表实例对象
this.y = y;
} toString() {
return '(' + this.x + ',' + this.y + ')';
}
}
Promise 是什么,有什么作用?
Promise 是 ES6 引入的一个新的对象,他的主要作用是用来解决 JS 异步机制里,回调机制产生的“回调地狱”。它并不是什么突破性的 API,只是封装了异步回调形式,使得异步回调可以写的更加优雅,可读性更高,而且可以链式调用。
promise 对象的用法, 手写一个 promise
promise 是一个构造函数,下面是一个简单实例
var promise = new Promise((resolve,reject) => {
if (操作成功) {resolve(value)
} else {reject(error)
}
})
promise.then(function (value) {
// success
},function (value) {
// failure
})
for…in 和 for…of 有什么区别?
ES6 统一了遍历标准,制定了可遍历对象,那么用什么方法去遍历呢?答案就是用 for…of。ES6 规定,有所部署了载了 Iterator 接口的对象 (可遍历对象) 都可以通过 for…of 去遍历,而 for..in 仅仅可以遍历对象。
这也就意味着,数组也可以用 for…of 遍历,这极大地方便了数组的取值,且避免了很多程序用 for..in 去遍历数组的恶习。
上面提到的扩展运算符本质上也就是 for..of 循环的一种实现。
十八、Generator 函数是什么,有什么作用?
答:如果说 JavaScript 是 ECMAScript 标准的一种具体实现、Iterator 遍历器是 Iterator 的具体实现,那么 Generator 函数可以说是 Iterator 接口的具体实现方式。
执行 Generator 函数会返回一个遍历器对象,每一次 Generator 函数里面的 yield 都相当一次遍历器对象的 next()方法,并且可以通过 next(value)方法传入自定义的 value, 来改变 Generator 函数的行为。
Generator 函数可以通过配合 Thunk 函数更轻松更优雅的实现异步编程和控制流管理。
async 函数是什么,有什么作用?
答:async 函数可以理解为内置自动执行器的 Generator 函数语法糖,它配合 ES6 的 Promise 近乎完美的实现了异步编程解决方案。
Class、extends 是什么,有什么作用?
答:ES6 的 class 可以看作只是一个 ES5 生成实例对象的构造函数的语法糖。它参考了 java 语言,定义了一个类的概念,让对象原型写法更加清晰,对象实例化更像是一种面向对象编程。Class 类可以通过 extends 实现继承。它和 ES5 构造函数的不同点:
a. 类的内部定义的所有方法,都是不可枚举的。
module、export、import 是什么,有什么作用?
答:module、export、import 是 ES6 用来统一前端模块化方案的设计思路和实现方案。export、import 的出现统一了前端模块化的实现方案,整合规范了浏览器 / 服务端的模块化方法,用来取代传统的 AMD/CMD、requireJS、seaJS、commondJS 等等一系列前端模块不同的实现方案,使前端模块化更加统一规范,JS 也能更加能实现大型的应用程序开发。
import 引入的模块是静态加载(编译阶段加载)而不是动态加载(运行时加载)。
import 引入 export 导出的接口值是动态绑定关系,即通过该接口,可以取到模块内部实时的值。