Ecmascript-6
ES6 发布时间2015-6月,又称ECMAScript 2015
http://kangax.github.io/compat-table/es6/
迭代器协议
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols
- 要成为可迭代对象,一个对象必须实现@@iterator方法,这意味着对象 必须有一个键为@@iterator属性,可通过常量Symbol.iterator访问该属性
- [Symbol.iterator] - 返回一个符合迭代器协议的对象的无参数函数
- 只有实现了拥有以下语义的next方法,才能成为一个迭代器
next() {
// 返回一个拥有以下两个属性的对象
{
done(boolean) // 如果迭代器可以产生序列中的下一个值,则为false; 否则true
value // 返回任务的javascript值,done为true是,value=undfiened
}
}
Iterator概念
-
表 集合 概念的数据结构: Array Object Map Set
-
Iterator: 针对不同的表集合的数据结构,统一数据结构的遍历接口
-
提供统一,简便的访问接口
-
使得数据结构成员按照某种次序排列
-
ES6新提供的遍历命令 for ... of; 主要供for... of 消费
遍历过程
- 创建一个指针对象,指向数据结构的起始位置,也就是一个指针对象
- 第一次调用指针对象的next方法,可以将指针对象指向数据结构的第一个成员
- 第二次调用指针对象的next方法,可以将指针对象指向数据结构的第二个成员
- 不断调用next方法,直到它指向数据结构的结束位置
var arr = [1,2,3,4];
var it = arr[Symbol.iterator]();
console.info(it.next()); // {value: 1, done: false}
数据结构的默认Iterator接口
以下类型定义了默认的迭代器。该迭代器可以被 for...of 循环使用
Array.prototype
TypedArray.prototype
String.prototype
Map.prototype
Set.prototype
调用Iterator接口的场景
- 解构赋值
let set = new Set().add('a').add('b').add('c');
let [x,y] = set; // x='a' y='b'
let [first, ...rest] = set; // first = 'a'; rest = ['b','c']
- 扩展运算符
var str = 'hello';
console.info(...str) ; // ['h','e','l','l','0']
var d = {'a':'123', 'age': '1000'};
var b = {'a': '456', ...d};
console.info(b); // {a: "123", age: "1000"}
- yield
后面跟随一个可遍历的结构,它会调用改结构的遍历器接口
let generator = function*(){
yield 1;
yield* [2,3,4];
yield 5;
}
var it = generator();
for( var item of it) {
console.info(item); // 1,2,3,4,5
}
-
其他场合
-
for ... of
-
Array.from()
-
Map(), Set(), WeakMap(), WeakSet()
-
Promise.all()
-
Promise.race()
-
String
遍历
for循环
var arr = [1,3,4], length = arr.length;
for(var i =0 ;i< length; i++) {
console.info(arr[i]);
}
数组内置的forEach方法
arr.forEach(function(value){
console.info(value);
});
warn:break命令和return命令都不能奏效
for...in 遍历数组的键名
var aa = [1,2,3];
for( var index in aa) {
console.info(typeof index) //string
}
- 数组的键名是数字,而遍历的时候是字符串
- 不仅变脸数字键名还是遍历手动添加的其他键,甚至包括原型链上的键
- 某些情况下,for...in循环会以任意顺序遍历键名;
- 主要是为遍历对象而设计的; 不适用于遍历数组
for ...of
- 有与for...in一样简洁的语法,但是没有那些缺点
- 不同用于forEach方法,它可以与break、continue、和return配置使用
- 提供了遍历所有数据结构的统一操作接口