我知道在C#中你使用这样的foreach:foreach string str in array1 {console.writeline(str);}
“for each ... in”也是用在JavaScript中的吗?
答案 0 :(得分:7)
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--;)
答案 1 :(得分:2)
标准 JavaScript中没有for each in
。如果他们想扩展语言,它可能存在于特定的实现中。
for..in
仅通过关联与数组相关,因为它与对象相关,而数组是对象。 for..in
不循环遍历数组条目,正如for each
在C#中所做的那样。它也不会循环遍历数组索引,尽管人们倾向于认为它确实如此。 (它遍历属性名称;数组索引是属性名称,但数组对象也可以具有其他属性。)它更像是for each
和字典的键。我已经相当彻底地讨论过in this article。
答案 2 :(得分:1)
“for each ... in”返回值而不是键...请参见此处:
答案 3 :(得分:0)
in
运算符用于枚举javascript object
的属性(名称,而不是值) - 在javascript中,所有非基元都是对象(从Object继承)。< / p>
你像这样使用它
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
循环。