Symbol.iterator为每一个对象定义了默认的迭代器。该迭代器可以被 [for...of]
循环使用。
Symbol.iterator 属性的属性特性: | |
---|---|
writable | false |
enumerable | false |
configurable | false |
示例
var mm = {
a: 1,
b: 2,
[Symbol.iterator]: function* () {
yield* [{a: 1}, {b: 2}]
}
}
console.log([...mm]); // [{"a":1},{"b":2}]
console.log(Array.from(mm));// [{"a":1},{"b":2}]
如果一个迭代器 @@iterator 没有返回一个迭代器对象,那么它就是一个不符合标准的迭代器,这样的迭代器将会在运行期抛出异常,甚至非常诡异的 Bug。
var nonWellFormedIterable = {};
nonWellFormedIterable[Symbol.iterator] = () => 1;
console.log([...nonWellFormedIterable]); // VM482:3 Uncaught TypeError: Result of the Symbol.iterator method is not an object at <anonymous>:3:1
求长度
function count( iterator ) {
let count = 0;
for ( const _ of iterator ) { // eslint-disable-line no-unused-vars
count++;
}
return count;
}
console.log(count(mm)) // 2