修正一下自己的一个很简单的认知错误。一直认为for和for in应该是结果一样,甚至觉得for in是for的简便写法。于是栽进了个很简单的坑
例如随手百度了一下栗子:
var array=[1,2,3,4,5];
//定义一个数组,实现数组元素的遍历。
//用For...in实现
for(var i in array){
alert(array[i]);//数组的元素
}
//用for循环实现
for(var i=0;i<array.length;i++){
alert(array[i]);//数组的元素
}
然后在集合中的对象就遇到了问题,毕竟object对象没有.length,所以对于对象的属性操作就要用for..in,而对于比如数组的元素之类的,最好用for。参考一下链接:http://www.jb51.net/article/46953.htm
翻阅了下资料,不得不说一个兼容性的问题,for-in循环时,返回的是所有能够通过对象访问的、可枚举的属性,其中既包括存在于实例中的属性,也包含原型中的属性。然而在IE8甚至更前的IE浏览器中,存在屏蔽不可枚举属性的实例属性的问题。例如下一段摘抄于《javascript高级程序设计》中的一段代码:
var o={
name:"Daisy",
toString:function(){
return "My Object";
}
};
for(var prop in o){
if(prop=="toString"){
alert("Found toString");
}
}
正常运行的话,是会弹出Found toString提示框的,但是正因为老版本的IE中屏蔽了,就跳过该属性,不会弹出。该bug会影响默认不可枚举的所有属性和方法:包括:hashOwnProperty()、propertyIsEnumerable()、toLocaleString()、toString()和valueOf().
例外除了for..in,还可以用Object.keys()方法取得所有可枚举的实例属性。用Object.getOwnPropertyNames()可以获得所有包括不可枚举的实例属性。