- ES6 在2015年6月正式发布, 2015年6月之后发布的ES版本,包括ES7,ES8,ES9统称ES6
- ES6 中创建类使用的是class, ES6之前使用的是构造函数
- ES6 新特性
- 1.let 和 const 命令
- 2.es6的模版字符串
- 3.增强函数
- 4.扩展的字符串,对象,数组功能
- 5.解构赋值
- 6.Symbol
- 7.Map和Set
- 8.迭代器和生成器
- 9.Promise对象
- 10.Proxy 对象
- 11.async 的用法
- 12.类class
- 13.模块化实现
let 和 const
- 使用var定义的变量会有变量提升问题, var 在同一个作用于可以重复声明同名的变量,后声明的会覆盖之前声明的
- 使用let 定义的变量就没有变量提升问题, let 也不能重复声明重名的变量, let 声明的变量不会污染全局变量
- const 声明的是常量,一旦声明后就不能再修改, const 声明的常量也没有变量提升,也不能重复声明
const arr = [];
for (var i= 0; i < 10; i++) {
arr[i]=function(){
return i;
}
}
console.log(arr[5]()); // 10, 这里是因为var 定义的i会提升到for循环外,当for循环执行完后 i 就变成了10; 如果使用let 定义就不会提升到for循环外,输出的结果就是5
- ES6 函数你支持参数默认值
- ES6 支持剩余参数, 由三个点...和一个紧跟着的具名参数指定, 比如
function pick(obj, ...keys) { }
- 剩余运算符... , 把多个独立的参数合并到一个数组中
- 扩展运算符...,将一个数组分割,并将各个项作为分离的参数传递给函数
- 箭头函数没有this指向,只能通过查找作用域链来确认
- Object.is(参数1,参数2) 方法比较两个数据是否严格相等, 即比较值,又比较数据类型, 解决了=== 不严谨的问题
- Object.assign(target, obj1,obj2,...); 将后面的对象的属性合并到target上,冲突的属性覆盖解决
- 用Symbol声明的值是独一无二的,可以用来解决命名冲突,而且使用Symbol定义的属性只能通过[]访问,不能通过.访问,也不能通过属性的遍历获取到
const name = Symbol('name');
const name1 = Symbol('name');
console.log(name===name2); // false
- Set中引用的对象无法释放(强引用), 使用WeakSet引用的对象可以释放(弱引用),WeakSet不能传入非对象类型的参数,不可以迭代,没有forEach,没有size属性
- generator 函数,可以通过yield关键字,将函数挂起,为了改变执行流提供了可能性,同时为异步编程提供了方案, 与普通函数有如下区别:
- function后面 函数名之前有个*
- 只能在函数内部使用yield表达式,让函数挂起
- generator 函数是分段执行的,yield语句是暂停执行,而next()恢复执行
function* func(){
console.log('one');
yield 2;
console.log('two');
yield 3;
console.log('end');
}
let fn = func();
console.log(fn.next()); // one, {value: 2,done:false} , 挂起在yield 2的位置,并将2作为value返回
console.log(fn.next()); // two, {value: 3,done:false} , 挂起在yield 3的位置,并将3作
console.log(fn.next());// three,{value:undefine, done:true}
网友评论