javascript中for in语句可以迭代array,string以及object属性,在迭代object属性是并不能迭代所有对象的所有属性,有些特殊情况下,例如一些对象的属性标示为只读或者不可变的,标示为不可迭代的。这些属性不能被for/in迭代。所有用户自定义属性是可以迭代的,许多内建属性包括所有内建方法是不可以被迭代的。对象是可以继承其他对象的属性的,继承而来的属性是用户自定义属性,是可以用for/in迭代的。
值得注意的是对object不能迭代的属性用用户自定义属性覆盖,在firefox,webkit里就可以迭代了,但是在ie里仍然不可以迭代。
例如:
for(var key in {valueOf:1}) {
alert(key)
}
在ie里弹不出“valueOf”,在firefox,webkit等浏览器里可以
所以若使用for in进行对象属性复制,在ie里是不可以复制用户自定义的和不可迭代属性同名的属性例如toString,valueOf,这样的话就需要显示在for in外面复制,代码如下:
for IE:
function(object, configs) {
if (object && config && typeof config === 'object') {
for (var key in config) {
object[key] = config[key];
}
if (config.toString !== Object.prototype.toString) {
object.toString = config.toString;
}
if (config.valueOf !== Object.prototype.valueOf) {
object.valueOf = config.valueOf;
}
}
return object;
};