我目前在代码中使用两种迭代:
对象(代码段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个分支,具体取决于类型(数组,对象或其他)。
答案 0 :(得分:1)
它可以工作,而数组中唯一可枚举的属性是编号槽(默认值为Array
),但它不能保证返回属性的排序,因为它们是定义为for ( in )
顺序,并不总是以数字方式迭代(取决于属性的分配方式)。
如果您分配了另一个属性,那么它也会被枚举(使用更标准的迭代技术不会发生这种情况)。
对于空插槽(例如new Array(25)
),它的行为也不会相同,因为for
循环会迭代这些插槽。
通常建议对数组使用for
循环,或forEach()
方法(或相关)。