修改对象的 for...of 循环行为
Modify an object's for...of loop behavior
考虑到 ES6 中新的 'Symbol' 原语,是否可以 modify/set 对象中 for...of 循环的行为?
我正在为 'iterable' 中的 'deep extracting' 值创建一个小实用程序(我将其定义为对象、数组、映射或集合)。
Array、Map 和 Set 使用 for..of 循环,但普通对象不使用。为了保持一致性,我希望对象使用此循环(并且应该遍历值而不是属性(因为 for...in 允许您这样做))。
这可以做到吗?
好吧,你可以这样做(适用于全局原型的常见警告):
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))
。
考虑到 ES6 中新的 'Symbol' 原语,是否可以 modify/set 对象中 for...of 循环的行为?
我正在为 'iterable' 中的 'deep extracting' 值创建一个小实用程序(我将其定义为对象、数组、映射或集合)。
Array、Map 和 Set 使用 for..of 循环,但普通对象不使用。为了保持一致性,我希望对象使用此循环(并且应该遍历值而不是属性(因为 for...in 允许您这样做))。
这可以做到吗?
好吧,你可以这样做(适用于全局原型的常见警告):
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))
。