我测试了以下代码:
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
这种差异的技术原因是什么,为什么这种明显的不一致被接受为默认行为?
答案 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
的值一样出现。