为什么..在获取所有属性,但是...的...没有获得所有值?

时间:2015-12-07 14:11:56

标签: javascript ecmascript-6

我测试了以下代码:

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

但是......没有获得所有值

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

返回:

3
5
7

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

2 个答案:

答案 0 :(得分:5)

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

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

这不是"不一致",它们是两个不同的运营商,旨在用于两个不同的目的。我可以理解像[Symbol.iterator]这样的东西会在数组中添加一个元素 - 因为你可以通过类似的语法访问数组的元素,就像在arr["boo"] ="moo"中一样。但是很容易确认那些效果不一样 - arr[0]您正在创建一个也可以由arr["boo"] ="moo"访问的属性,但是尝试例如,arr.boo访问数组元素会出现语法错误,因为它们与属性不同。

答案 1 :(得分:2)

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

这是一个阵列;非整数属性永远不会是数组的值,这是for...of将为您提供的。

您正在为arr对象添加奖励属性,但期望arr.foo中显示for..of的值,就像期望arr.length的值一样出现。