@@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);
}