javascript中'for ... in'和'for each ... in'之间有什么区别?

时间:2010-12-28 17:34:06

标签: javascript foreach for-loop

我知道在C#中你使用这样的foreach:foreach string str in array1 {console.writeline(str);} “for each ... in”也是用在JavaScript中的吗?

4 个答案:

答案 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。如果他们想扩展语言,它可能存在于特定的实现中。

JavaScript中的

for..in仅通过关联与数组相关,因为它与对象相关,而数组是对象。 for..in 循环遍历数组条目,正如for each在C#中所做的那样。它也不会循环遍历数组索引,尽管人们倾向于认为它确实如此。 (它遍历属性名称;数组索引是属性名称,但数组对象也可以具有其他属性。)它更像是for each和字典的键。我已经相当彻底地讨论过in this article

答案 2 :(得分:1)

“for each ... in”返回值而不是键...请参见此处:

http://www.dustindiaz.com/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循环。