2

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

对于对象(片段 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 开始)?

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

4

1 回答 1

1

当您的数组上唯一可枚举的属性是编号的插槽( an 的默认值Array)时,它将起作用,但它不能保证返回属性的顺序,因为它们被定义为按for ( in )顺序排列,这并不' 并不总是以数字方式迭代(取决于属性的分配方式)。

如果您分配了另一个属性,它也会被枚举(这不会发生在更标准的迭代技术中)。

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

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

于 2013-02-01T00:33:11.290 回答