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相同,但可能有办法知道某些属性是对象/数组等的遗留属性还是仅由用户定义的属性