如何解决传播算子如何使用Java中的Iterator / Generator从对象获取值?
我有以下一段代码定义了一个数组,然后一个带有生成器的迭代器对象从该数组中产生值,然后使用散布运算符输出每个值:
const arr = ['0','1','4','a','9'];
const my_obj = {
[Symbol.iterator]: function*() {
for(let index of arr) {
yield `${index}`;
}
}
};
const all = [...my_obj]
console.log(...my_obj)
结果是:
0
1
4
a
9
我不明白的是,如果“ my_obj”是对象而不是数组,那么散布运算符“ ... my_obj”如何获取数组的值。据我了解:“ my_obj”正在接收对象,如果您应用传播运算符,它将获得“ key:value”。
有人可以解释一下它是如何获得这些值的吗?
解决方法
spread运算符允许将诸如数组表达式或字符串之类的可迭代对象扩展到需要零个或多个参数(用于函数调用)或元素(用于数组文字)的位置,或者将对象表达式扩展到位置其中应该有零个或多个键值对(用于对象文字)。
我们可以通过自己制作一个来轻松掌握可迭代的概念。
例如,我们有一个不是数组的对象,但看起来适合于...
- 当for..of启动时,它将调用该方法一次(如果未找到则调用错误)。该方法必须返回一个迭代器–下一步是该方法的对象。
- 然后,for..of仅适用于该返回的对象。
- 当for..of需要下一个值时,它将在该对象上调用next()。
- next()的结果必须采用{done:Boolean,value:any}的形式,其中done = true表示迭代已完成,否则value是下一个值。
如果对象满足可迭代性,即for..of循环。可以使用散布运算符进行散布,并且可以在数组中进行分配,因为数组也是可迭代的。
参考: iterables in javascript spread operator
,散布运算符和for...of
语句调用对象的iterable protocol。某些对象,例如Array
,String
,Set
和Map
内置了可迭代的协议。这意味着他们拥有@@iterator
方法。
您自己刚刚创建了一个对象,并将其赋予属性[Symbol.iterator]
。现在,您的对象知道在此对象上调用for...of
的扩展语法时该怎么做,这就是调用此迭代器并在[Symbol.iterator]
键中由generator函数创建的可迭代对象上循环。 / p>
在生成器函数中,您已指定在每次迭代时都应产生arr
的值,直到该循环完成为止。
MDN显示了一个示例here,其中说:
一些内置的构造(例如传播语法)在后台使用相同的迭代协议:
console.log([...someString]); // ["h","i"]
您有时会看到的模式是对象具有values
方法。在大多数情况下,这实际上是一个生成器函数。调用[Symbol.iterator]
时,它返回生成器函数,该函数然后循环遍历对象中的值。
在这里,我创建了一个小示例,该示例使用一个字符串并使用for...of
循环遍历字母,并使用 spread 运算符对其进行布局。两者都使用相同的可迭代协议。
class LettersObjects {
*values() {
// Here we use the iterable protocol of a string.
for (const letter of this.letters) {
yield letter;
}
}
// This is called with for...of and ...spread.
[Symbol.iterator]() {
return this.values();
}
constructor(letters) {
this.letters = letters;
}
}
const letters = new LettersObjects('Hello world');
// Call the iterable protocol on our LetterObjects instance.
for (const letter of letters) {
console.log('loop:',letter);
}
// Call the iterable protocol on our LetterObjects instance.
console.log('Spread:',...letters);
,
发生这种情况是因为对象是可迭代的。
传播操作符传播可迭代对象而不是数组。它可以散布对象,甚至可以散布字符串。
快速查看传播算子documentation,您会更好地理解。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。