使用 for .. in 遍历对象,似乎没什么好说的,不过还是有例外。在各个浏览器里面跑下面的代码:
var obj = {
toString: function() {
return "custom.toString()";
}
}
for(var i in obj) {
alert(i);
}
它们都会 alert 一个 toString,除了 IE。一开始还以为是加载慢,后来才认识到,其实 IE 并不把它当成是一个自定义的对象方法。同样的情况也发生在 valueOf() 方法上,可以猜想,IE 可能把它当成是 native 的了。
在 Quick Fix – Internet Explorer and toString problems 里面,介绍了使用条件注释(conditional comment)的方法来解决。
/*@cc_on
if(obj.toString!==Object.prototype.toString){
// doStuff
}
if(obj.valueOf!==Object.prototype.valueOf){
// doStuff
}
@*/
但是,IE 就真的把它当成了 native 的了吗?
obj.hasOwnProperty("toString"); // === true
通过 hasOwnProperty,它似乎又是知道 toString 实际上是一个自定义属性。那么,情况就变得更加怪异了,只能说 IE 在两种情况下处理的依据是不一样的,又或者说这就是一个 bug。
要处理这个例外,除了使用条件注释,还可以使用下面的方式:
if ($.browser.msie) {
if (obj.hasOwnProperty("toString")) {
// do have a toString
}
if (obj.hasOwnProperty("valueOf")) {
// do have a valueOf
}
}