为啥 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 对象,我看到 valueskeysentries 方法都总是返回空对象。例如:

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 对象为键/值/条目方法返回空对象?的主要内容,如果未能解决你的问题,请参考以下文章

为啥javascript标签使用“文本”?

为啥 HtmlUnitDriver 不执行 JavaScript?

为啥 JavaScript 需要以“;”开头?

为啥会这样? (冒泡排序)[JavaScript]

为啥javascript向后兼容故障?

为啥 JavaScript 需要“等待”? [复制]