- for...of只能遍历拥有iterator属性的对象,所以普通的对象是无法使用iterator遍历的,可以自己模拟一个遍历器,代码如下:
let obj = {
a: 1,
b:2
}
// 自定义遍历器
Object.defineProperty( obj, Symbol.iterator, {
enumerable: false,
writeable: false,
configurable: true,
value(){
let keys = Object.keys(obj)
let idx = 0
let o = this
return {
next(){
return {
value: o[keys[idx++]],
done: (idx > keys.length)
}
}
}
}
})
for(let v of obj){
console.log(v) // 1 2
}
- 根据遍历器的特性,我们可以定义一个"无限迭代器",下面展示一个随即生成"无限个"手机号码的例子
let seconds = [3,4,5,7,8]
let numList = []
let randomNum = {
[Symbol.iterator](){
return {
next(){
return {
value: `1${seconds[Math.floor(Math.random()*seconds.length)]}${parseInt(Math.random()*899999999+100000000)}`
}
}
}
}
}
for(let v of randomNum){
numList.push(v)
if(numList.length === 100) break // 如果不对数量加以控制,则永远不会结束,程序将被挂起
}
console.log(numList)
网友评论