Javascript 为什么。。in获取所有属性,但对于。。不';你没有得到所有的价值观吗?

Javascript 为什么。。in获取所有属性,但对于。。不';你没有得到所有的价值观吗?,javascript,ecmascript-6,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 (i in arr) { console.log(i); } 返回: 0 1 2 foo boo 3 5 7 但是。。of无法获取所有值 f

我测试了以下代码:

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 (i in arr) {
   console.log(i); 
}
返回:

0 
1 
2 
foo 
boo
3
5
7
但是。。of无法获取所有值

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

0 
1 
2 
foo 
boo
3
5
7
造成这种差异的技术原因是什么?为什么这种明显的不一致被视为默认行为?

for(…in…语法可用于任何对象,并将迭代该对象的所有属性。更严格地说,此循环将迭代对象中的任何属性,这些属性是内部定义的,并且其
[[Enumerbale]]
属性设置为true

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


这不是“不一致”,它们是两个不同的操作符,用于两个不同的目的。我可以理解这样做可能会有什么样的感觉,比如
arr[“boo”]=“moo”
会向数组添加元素——因为您可以通过类似的语法访问数组的元素,如
arr[0]
。但是很容易确认它们在效果上是不同的-使用
arr[“boo”]=“moo”
您正在创建一个属性,该属性也可以通过
arr.boo
访问,但是尝试通过(例如,
arr.0
访问数组元素将是一个语法错误,因为它们与属性不同。

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

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


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

为什么它们是相同的?它们是两个不同的运算符,对两种不同的行为很有用。@Bergi这篇文章很好地阐述了我的一些观点。@EduardFlorinescu:我看不出你有任何观点:-)
for of
没有枚举所有的属性值,它迭代元素-对于一个数组,元素只是数组元素。@sphanley我从来没有说过或暗示过相同的内容,你可以看到如果你读了我提到的“属性与值”的标题,我会预期类似的行为,但我在任何地方都没有暗示过相同的内容。这是因为arr[“长度”]与JavaScription中的arr.length相同,但可能有办法知道某些属性是对象/数组等的遗留属性还是仅由用户定义的属性