一个对象只能定义一个符号Symbol.iterator
,该符号将在对象本身的迭代中被调用。对象的其他属性,例如您给出的示例 ( entries
, keys
, values
) 也可能返回一个迭代器,但这些通常不是相同的迭代器。它们可能是相同的,但这只是一个实现选择。使用 迭代对象时,调用哪个迭代器没有歧义for..of
。它是由 . 返回的那个[Symbol.iterator]
。
- 如何从对象中获取迭代器?
您可以通过调用以 为键的函数来获取它Symbol.iterator
,例如
const iterator = obj[Symbol.iterator]();
它是用 隐式检索的for..of
。
- 规范中在哪里指定?
规格中的此表说明:
@@iterator "Symbol.iterator"
返回对象的默认迭代器的方法。由for-of
语句的语义调用。
以下是如何创建自定义函数以返回对象的默认迭代器(覆盖默认迭代器),并查看它是如何被调用的:
const obj = {
// Define a custom function for returning the default iterator for this object
[Symbol.iterator]: function () {
console.log('The iterator-returning function got invoked');
// Return an iterator from some other object
// (but we could have created one from scratch as well):
return 'abc'[Symbol.iterator]();
},
myMethod: function () {
// This method happens to return the same iterator
return this[Symbol.iterator]();
},
myOtherMethod: function () {
// This method happens to return another iterator
return 'def'[Symbol.iterator]();
}
}
for (const a of obj) {
console.log(a); // a b c
}
for (const a of obj.myMethod()) {
console.log(a); // a b c
}
for (const a of obj.myOtherMethod()) {
console.log(a); // d e f
}
.as-console-wrapper { max-height: 100% !important; top: 0; }