@@iterator是一个可以返回迭代器对象的函数。
调用迭代器的next()方法会返回形式为{value: .. , done: ..} 的值, value是当前的遍历值, done是一个布尔值, 表示遍历是否结束。
var obj = {
a: 2,
b: 3
}
Object.defineProperty(obj, Symbol.iterator, {
writeable: false,
enumerable: false,
configurable: true,
value: function() {
let o = this,
index = 0,
keys = Object.keys(o);
return {
next: function() {
return {
value: o[keys[index++]],
done: index > keys.length
}
}
}
}
})
let it = obj[Symbol.iterator]();
console.log(it.next());
console.log(it.next());
console.log(it.next());
// for .. of 会寻找内置或者自定义的@@iterator对象并调用它的next()方法来遍历数据值。
for(let k of obj) {
console.log(k);
}