【问题标题】:Why for .. in gets all the properties, but for .. of doesn't get all the values?为什么 for .. in 获取所有属性,但 for .. of 没有获取所有值?
【发布时间】:2016-03-12 04:13:39
【问题描述】:

我测试了以下代码:

arr = [3, 5, 7];

arr.foo = "hello";

arr["boo"] ="moo"


for (i in arr) {
   console.log(i);
}

for (i of arr) {
   console.log(i); 
}

for .. in 获取 all 数组的属性。

for (i in arr) {
   console.log(i); 
}

返回:

0 
1 
2 
foo 
boo

但是对于 .. of 并没有得到所有的值

  for (i of arr) {
       console.log(i); 
    }

返回:

3
5
7

造成这种差异的技术原因是什么?为什么这种明显的不一致被接受为默认行为?

【问题讨论】:

  • 为什么它们是一样的?它们是两个不同的运算符,对两种不同的行为很有用。
  • @Bergi 这篇文章很好地涵盖了我的一些观点。
  • @EduardFlorinescu:我看不出你在说什么 :-) for of 不会枚举所有属性值,它会迭代元素——对于数组来说,它只是数组元素。
  • @sphanley 我从来没有说过或暗示相同,你可以看看如果你阅读我提到属性与值的标题,我会期待类似的行为,但我并没有在任何地方暗示相同。

标签: javascript ecmascript-6


【解决方案1】:

for (... in ...) 语法可用于任何对象,并将遍历该对象的所有属性。从技术上讲,这个循环将遍历对象中的任何属性,这些属性在内部定义为 [[Enumerbale]] 属性设置为 true。

for (... of ...) 语法是 ES6 中的新语法,它特定于 集合,而不是所有对象。它提供了一种迭代集合元素的简写方式,而不必使用带有索引的普通forwhile 循环。它将以这种方式遍历具有[Symbol.iterator] 属性的任何集合的任何元素。

这不是“不一致”,它们是两个不同的运算符,旨在用于两个不同的目的。我可以理解像arr["boo"] ="moo" 这样的操作会如何向数组中添加一个元素——因为您可以通过类似的语法访问数组的元素,如arr[0]。但是很容易确认它们实际上并不相同 - 使用arr["boo"] ="moo",您正在创建一个也可以由arr.boo 访问的属性,但尝试通过@987654331 访问数组的元素@ 将是一个语法错误,因为它们与属性不同。

【讨论】:

    【解决方案2】:

    您试图将数组视为对象或关联数组(不是 JavaScript 中的东西)。

    这是一个数组;非整数属性永远不会是数组的值,这就是 for...of 将得到的。

    您正在向arr 对象添加额外属性,但期望arr.foo 的值出现在for..of 中就像期望arr.length 的值出现一样。

    【讨论】:

    • 那是因为 arr["length"] 和 JavaScript 中的 arr.length 是一样的
    • 但是可能有办法知道某些属性是对象/数组等的遗留物还是只是由用户定义的
    猜你喜欢
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多