为啥 javascript 的 ES6/Harmony Set 对象为键/值/条目方法返回空对象?
Posted
技术标签:
【中文标题】为啥 javascript 的 ES6/Harmony Set 对象为键/值/条目方法返回空对象?【英文标题】:Why does javascript's ES6/Harmony Set objects return empty objects for the keys/values/entries methods?为什么 javascript 的 ES6/Harmony Set 对象为键/值/条目方法返回空对象? 【发布时间】:2016-01-03 19:56:03 【问题描述】:我正在尝试节点 4.1.2 中的新 Set
对象,我看到 values
、keys
和 entries
方法都总是返回空对象。例如:
var x = new Set
x.add(1)
x.add(2)
x.values() // returns
这是预期的行为吗?我无法想象它是。
【问题讨论】:
x.values()
不是迭代器吗?如果你.next().value
它会发生什么?
嘿,x.values().next().value
似乎有效。这就引出了一个问题:为什么 javascript 有迭代器?既然它有迭代器,为什么它们不在for(x in y)
循环中工作?
因为你现在用for ( let z of x ) console.log(z);
啊,我明白了。实际上并不是“你现在使用 ..of
..”——for..in
的使用根本没有改变。相反,for..of
是一种新的结构,它迭代值而不是键,并且由于迭代器没有键,in
没有任何东西可以循环。我仍然认为他们最好远离迭代器的概念。
【参考方案1】:
ES6 添加了一些新技巧,包括迭代协议。您可能想查看 MDN 上的 Iteration Protocols 以更深入地了解如何使用它们。 for(item in array)
仍然存在,但您可以在某些事情上使用新的 for ... of
。
考虑您的代码:
var x = new Set
x.add(1)
x.add(2)
x.values()
让我们这么说,var y = x.values();
,y
是一个迭代器;
为了迭代所述迭代器,您使用for(let item of iterable)
循环。在这种情况下,您将使用:
for(let z of x)
console.log(z);
会打印出来:
1
2
【讨论】:
看起来将迭代器转换为数组在 2.5.0 中并不完全存在,但在 v4 中有:***.com/questions/27612713/…【参考方案2】:值在那里,只是util.inspect()
没有显示它们。这已在 master 中使用 88533881d 修复,这是 v4.1.2 之后的版本。因此,只要 v4.1.3 发布,您就会看到修复。
【讨论】:
for(var n in x.values()) console.log(n)
不记录任何内容,所以我认为这不仅仅是util.inspect()
的问题。以上是关于为啥 javascript 的 ES6/Harmony Set 对象为键/值/条目方法返回空对象?的主要内容,如果未能解决你的问题,请参考以下文章