用于迭代数组的Object.keys

时间:2013-02-01 00:31:16

标签: javascript arrays object for-loop

我目前在代码中使用两种迭代:

对象(代码段1):

for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        // do stuff with key and obj[key]
    }
}

对于数组(代码段2):

for (var i=0, count=arr.length;i<count;i++) {
    // do stuff with i and arr[i]
}

我想简化我的代码并对对象和数组使用单个函数(代码段3):

var keys=Object.keys(arrorobj);
for (var i=0, count=keys.length;i<count;i++) {
    // do stuff with keys[i] and arrorobj[keys[i]]
}

我知道片段3对于对象来说很好,但它是否也会像我期望的那样使用数组,并替换片段1和2?特别是,我可以放心,在所有浏览器中(好吧,至少那些支持Object.keys的那些)代码段3将尊重键顺序(从索引0开始)?

[edit]我计划特别使用它来深度合并对象。我当前的代码很重,因为在每个级别我有3个分支,具体取决于类型(数组,对象或其他)。

1 个答案:

答案 0 :(得分:1)

它可以工作,而数组中唯一可枚举的属性是编号槽(默认值为Array),但它不能保证返回属性的排序,因为它们是定义为for ( in )顺序,并不总是以数字方式迭代(取决于属性的分配方式)。

如果您分配了另一个属性,那么它也会被枚举(使用更标准的迭代技术不会发生这种情况)。

对于空插槽(例如new Array(25)),它的行为也不会相同,因为for循环会迭代这些插槽。

通常建议对数组使用for循环,或forEach()方法(或相关)。