过匹配"for in"在JavaScript

Over matching of "for in" in JavaScript

本文关键字:quot JavaScript in for      更新时间:2023-09-26

我有一个数组var test = [1, 2, 3]。当使用for in方法遍历数组时,发生了一些错误。请参阅这里的代码片段:

var test = [1, 2, 3]    
for (var i in test) {
    alert(i);
}

它将警告代码片段中的"0","1"answers"2"。但在我的电脑里,它会提醒"0"、"1"、"2"和一个"等于"。我认为equal是数组对象本身的一个方法。

此行为在一周前没有出现,因此我之前使用for in编写的代码受到强烈影响。

谁能告诉我是什么导致了这种奇怪的行为?如何在不更改代码的情况下避免这种行为?

这是因为您正在使用的某些库(甚至可能是您自己编写的库)会这样做:

Array.prototype.equals = function() { ... }

这是in操作符的缺点——它也列举了额外的属性。您可以使用hasOwnProperty()方法检查i,并忽略未在对象上设置的属性。或者,对于数组,使用

for (var i = 0; i < test.length; i++ )

当然,这只适用于从0开始的连续数组

for (var i in test)枚举test数组的所有属性(记住数组是一个对象,也可以有任意的非数字属性)。这不仅包括数组的索引,还包括其他人可能添加到array对象中的任何可枚举属性。这通常被认为是枚举数组的错误方式。该结构体用于枚举对象的所有属性,而不仅仅是数组的数组索引。

相反,您可以使用以下任何一种:

for (var i = 0; i < test.length; i++) 
test.forEach(fn);
test.every(fn);
test.some(fn);

这些将只枚举实际的数组项,而不是添加到数组中的其他属性。

对于稀疏数组(并非所有项都已初始化),for循环将访问每个项(甚至是未初始化的项),而其他循环将跳过未初始化的项。


事实上,你看到equal属性显示在你的枚举意味着有人添加了一个可枚举的属性到Array对象,因此它显示了for (var i in test)形式的枚举。


ES6中,您还可以使用of迭代技术,这将对非数组元素属性是安全的,并且将返回.forEach()将返回的相同项。注意,它还与in不同,因为它传递的是实际的数组值,而不是数组索引:

var test = [4, 7, 13];
test.whatever = "foo";
for (var item of test) {
    console.log(item);   // 4, 7, 13
}