【发布时间】:2010-12-28 17:34:06
【问题描述】:
我知道在 C# 中你像这样使用 foreach:foreach string str in array1 {console.writeline(str);}
“for each ... in”在 JavaScript 中也像这样使用吗?
【问题讨论】:
标签: javascript foreach for-loop
我知道在 C# 中你像这样使用 foreach:foreach string str in array1 {console.writeline(str);}
“for each ... in”在 JavaScript 中也像这样使用吗?
【问题讨论】:
标签: javascript foreach for-loop
Afaik 只有 Firefox 支持 for each...in。它不是任何标准的一部分,大多数工具(如JSLint)在遇到它时都会抛出错误。
不同之处在于for...in 循环遍历对象的键,而for each...in 循环遍历值。
所以推荐的方法是不使用 for each 而做
for (var key in obj) {
console.log(obj[key]);
}
改为。
更新:我不能说它与 C# 有什么关系。但关于数组:永远不要使用for...in 遍历数组(yellow box here):
尽管将其用作迭代数组的方法可能很诱人,但这是一个坏主意。
for...in语句除了遍历数组元素之外还遍历用户定义的属性,因此如果您修改数组的非整数或非正数属性(例如,通过向其添加“foo”属性,甚至添加方法或属性到Array.prototype),for...in语句将返回除数字索引之外的用户定义属性的名称。
改用普通的for 循环:
for(var i = 0, l = arr.length; i<l; i++)
或者更花哨的:
for(var i = arr.length; i--;)
【讨论】:
标准 JavaScript 中没有for each in。如果他们想扩展语言,它可能存在于特定的实现中。
JavaScript 中的for..in 仅通过关联与数组相关,因为它与对象相关,而数组就是对象。 for..in 确实 not 循环遍历数组条目,就像 for each 在 C# 中所做的那样。它也不会循环遍历数组索引,尽管人们倾向于认为它会这样做。 (它遍历属性名称;数组索引是属性名称,但数组对象也可以有其他属性。)它更像是带有字典键的for each。我已经相当彻底地讨论了这个in this article。
【讨论】:
“for each ... in”返回值而不是键...见这里:
【讨论】:
in 运算符用于枚举 javascript object 的属性(名称,而不是值) - 在 javascript 中,所有非基元都是对象(继承自 Object)。
你是这样用的
var obj = {
a: "aaa",
b: "bbb"
};
for (var key in obj) {
if (obj.hasOwnProperty(key)){
console.log("obj has a property " + key + ", with a value of " + obj[key]);
}
}
由于in还枚举了通过原型链继承的属性,我们必须使用hasOwnProperty来检查这些是否确实是对象自己的属性,而不仅仅是继承的属性。
注意,in 运算符永远不能用于枚举存储在数组中的项目 - 为此,您应该使用带有索引的常规 for/while 循环。
【讨论】: