参考资料
阮一峰《ES6标准入门教程》
- 通过node命令行可以查看node已经实现的ES6的新特性
- 好多新特性在浏览器等仍然无法实现,但是可以通过工具,加载库文件等将ES6编译成ES5,从而使之可以执行。
- 声明变量的let命令:
- 变量的作用域在代码块中,很好的解决了var变量没有代码块作用域的问题典型例子:var必须依靠闭包才能够输出循环中1~10的数字
- 不能重复赋值
- let声明出来的变量没有变量提升的特性,所以必须在声明之后才能够使用
- 存在暂时性死区,let声明的变量被绑定在一个封闭的代码块中,并且外部以前声明过的语句对他产生不了任何影响,在代码块中let声明之前,使用
typeof temp;
这样是会报错的,很好的提高了程序员的编码习惯,一定是先声明后使用。
块级作用域:好处是:解决了循环中声明变量泄露污染全局的问题,解决了函数中内部变量可能会覆盖函数外部变量的问题。坏处是:代码块中的函数无法被外界所引用,需要改变编码时候的思维。
- const命令:
- const声明常量,声明时必须赋初值
- 不能重复赋值。
- const声明的常量没有变量提升的特性,同样只在代码块中起作用
- const声明的常量如果是一个引用类型的话,保存的是地址,那个地址中保存的数据并没有被固定,想要固定一个对象的值的话可以使用
Object.freeze()
方法来实现。
跨模块属性:具体方法类似于python导入方法通用,import
全局对象的属性:let,const,class定义的属性不直接属于全局对象window或者global。(ES6中新增好多中定义属性的关键字)
- 数组的解析赋值:一一对应的赋值,对var,let、
,const均适用,形式要对应好,允许嵌套赋值,允许有默认值,允许有惰性函数值,允许有声明过的变量值传入,解析不成功就会出现undefined。 - 对象的解析赋值:
- 对象没有次序,注意的是属性名字的照应
- 被赋值的是变量,不是模式
- 对象名和变量名不一样时需要特殊的定义模式
- 注意定义时候代码块的影响。
-
var`` const`` let
均可使用,()
也可以成为一种定义形式
- 字符串解析赋值:注意类数组对象的length属性
- 数值布尔值的解析赋值:右边会转化成对象之后再去赋值(undefined和null无法转化成对象)
- 函数参数的解析赋值:传入参数的形式类似于传入了一个数组,传入的时候就是变量被赋值了。感觉并没有什么卵用啊!!!WTF
- 解析赋值中圆括号的问题:变量声明语句中,模式不能使用圆括号;函数参数不能使用圆括号;赋值语句中模式的整体或者一部分不能使用圆括号。只有在赋值语句中非模式的部分才可以使用圆括号。
Iterator和for...of循环
Iterator为数据结构提供统一的访问机制,任何数据结构只要部署了iterator接口,便可以完成遍历操作。
iterator有三种作用:一为数据结构提供统一的操作,二可以是数据成员按照某种次序排列,三是提供了for...of操作,iterator接口主要供for...of消费。
generator函数
- generator作用:是一种状态遍历器,控制了函数内部状态的变化.
- generator特征:两种定义方式,特有的yield语句和实例化对象next方法
var abc = function* (){ ... }
function* abc(){ ... }
- yield语句作用:每一条yield语句定义了一个状态.yield不能用在普通函数中,会报错.
- yield执行顺序:
- 每一次next方法的调用:
- 从进入函数开始执行到~第一条yield后面跟着的那条语句执行完毕为止.
- 多重嵌套的时候,将众多函数想象成执行流.若出现yield* ,则返回最内层generator函数yield语句执行结果.
- next方法:generator实例化产生新对象,具有next方法.每执行一次next方法,就返回{value,done}的一对状态值.
- value表示返回的yield语句后面表达式的那个值.
- done表示遍历是否完成.
function* helloWorldGenerator() {
yield 'hello';
yield 'world';
return 'ending';
}
var hw = helloWorldGenerator();
hw.next()
// { value: 'hello', done: false }
hw.next()
// { value: 'world', done: false }
hw.next()
// { value: 'ending', done: true }
hw.next()
// { value: undefined, done: true }
- yield 后面跟表达式
- 不能跟循环结构,无法正确编译.
- 不能跟着函数,如果想要后面连接函数,那么就分离函数,yield后面接上函数的执行语句.
function* three(obj) { //普通函数
yield obj.a;
}
function* two(obj) { //generator函数
obj.a ++;
yield* three(obj);
}
function* one() {
var obj = {
a:0
};
while (obj.a <= 100){
yield* two(obj);
}
}
var gen = one();
gen.next();
> Object {value: 1, done: false}
gen.next()
> Object {value: 2, done: false}
gen.next()
> Object {value: 3, done: false}
- generator函数实例化对象的next方法.
- next()方法可以带一个参数,可选,该参数会被当做上一条yield后面语句的返回值.
function* abc() { ... }
var gen = abc();
gen.next();
- generator异步操作的应用
- 利用generator函数暂停执行的作用,可以将异步操作的语句写到yield后面,通过执行next方法进行回调.
- yield语句和yield* 语句的区别
- yield 语句后面跟普通函数
- yield* 后面跟generator函数(遍历器函数)
- for...of循环,不需要next方法,可以全部遍历generator函数的执行结果.
网友评论