过匹配"for in"在JavaScript
Over matching of "for in" in JavaScript
我有一个数组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
}
- 可以<脚本类型=“;text/javascript”>window.location=“/"</
- Javascript复选框函数:;缺少:在属性id之后"
- 图像可以从源<img src=""/>.TEXT可以在没有javascript的情况下从外部
- CKEditor如何允许href="javascript:void(0)"在小部件中
- 插入“;img src"在javascript中
- "访问控制允许起源”;通过javascript从http页面调用同一网站的httpsurl时出现问题
- 尝试使用Javascript正则表达式来获取“&"分隔文本,无论它是否's是最后一个值
- 如何's css标记"-webkit最小设备像素比”;在Javascript中实现
- 内联javascript与"<脚本>"字符串错误地关闭了脚本标记
- 什么是"!函数(){}〃;javascript中的mean/do
- 使用javascript"这个“;用于jquery选择器
- 我可以在不使用乘法运算符“”的情况下进行乘法运算吗*"在JavaScript中
- 用分隔符分隔具有多个整数值的字符串的Javascript"重试错误的值
- 什么是==+"在javascript中
- 什么是“;回归"javascript中的mean
- 可以't删除“;C: fakepath "使用javascript替换和regex
- 如何删除“"使用javascript从字符串中提取字符
- 如何使用Javascript获取当前页面URL,并在<a href="[the_URL]”>
- JavaScript异常:“;不成形”;在firefox浏览器上;XMLHttpRequest"chrome浏
- button1.Attributes.Add(“onclick"“javascript: window.open