为什么 map、foreach 和 reduce 不使用 Symbol.iterator 上的迭代器函数?

Ben*_*Ben 5 javascript

为什么map, foreach, andreduce不使用迭代器函数 on Symbol.iterator

class MyArray extends Array {
    *[Symbol.iterator]() {
        for(let x = 0; x < this.length; x++) { yield this[x]*2 }
    }
}

const log = console.log
const arr = new MyArray(1,2,3)
console.log([...arr]) // [2,4,6]
log(arr.map((i) => i)) // [1,2,3]
Run Code Online (Sandbox Code Playgroud)

和:

const arr = [1,2,3]
Object.defineProperty(Object.getPrototypeOf(arr), Symbol.iterator, { 
    value: function*() {
        for(let x = 0; x < this.length; x++) { yield this[x]*2 }
    }
})

const log = console.log
log([...arr]) // [2,4,6]
log(arr.map((i) => i)) // [1,2,3]
Run Code Online (Sandbox Code Playgroud)

Poi*_*nty 3

“旧”数组方法是显式指定的,以便迭代是根据简单的数字索引序列进行的。例如,请参阅ES2016 规范

您可以使用Array.from(arr)它来使迭代器工作,然后调用.forEach()结果。

请注意,对于某些迭代方法,指定的行为是仅调用实际具有指定值的索引的回调。因为使用迭代器意味着遍历所有值,所以这会出现问题。迭代器函数对未赋值的值所能做的就是 return undefined,但是这样的话它就会变得不明确;这是否意味着容器中的槽从未被分配过值,或者是否意味着它已被显式分配undefined