javascript - 修改对象的 for...of 循环行为

标签 javascript ecmascript-6 for-of-loop

鉴于 ES6 中新的“Symbol”原语,是否可以修改/设置对象中 for...of 循环的行为?

我正在创建一个小实用程序,用于从“可迭代”(我将其定义为对象、数组、映射或集合)中“深度提取”值。

Array、Map 和 Set 使用 for..of 循环,但普通对象则不然。为了保持一致性,我希望对象能够使用此循环(并且应该迭代值而不是属性(正如 for...in 允许您这样做))。

这可以做到吗?

最佳答案

好吧,你可以这样做(关于全局原型(prototype)的常见警告适用):

Object.prototype[Symbol.iterator] = function* () {
    yield* Object.values(this);
};

x = {a: 1, b: 2}

for (let y of x)
    console.log(y)

Object.defineProperty(
    Object.prototype,
    Symbol.iterator, {
        value: function*() {
            yield* Object.values(this);
        }
    }
);

myObj = {x: 1, y: 2}
console.log([...myObj])

但是,一个更简洁的解决方案是引入一个通用包装器,该包装器可以对本身不可迭代的对象启用迭代:

let iter = function* (a) {
    if (a === null || a === undefined)
        return;

    if (!a[Symbol.iterator]) {
        if (typeof a === 'object')
            a = Object.values(a);
        else
            a = [a];
    }

    for (let x of a)
        yield x;
};

console.log([...iter('abcd')])
console.log([...iter(123)])
console.log([...iter({a: 1, b: 2})])

然后只需在代码中使用 for (x of iter(whatever)) 即可。

关于javascript - 修改对象的 for...of 循环行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49065523/

相关文章:

javascript - 继承的 Angular 2 组件中的输入属性

javascript - ES6 类属性定义

javascript - 如何将嵌套数组减少为单个对象数组

javascript - 如何制作脚注以在单击的位置显示其引用的文本?

javascript - 如何在图表js中绘制一条到最高数据点的线?

javascript - for 循环和解构

Javascript - 尝试循环对象时 for-of 循​​环崩溃

Javascript for...of 在 Safari 中不起作用

javascript - 跨平台的 ID 编码差异?

javascript - 如何像 EC​​MA6 提案中那样使用迭代器?