记录一下js中的for/for..in,以及早期IE浏览器对于实现中存在的bug现象

来源:互联网 发布:淘宝黑科技产品 编辑:程序博客网 时间:2024/04/28 22:02

修正一下自己的一个很简单的认知错误。一直认为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()可以获得所有包括不可枚举的实例属性。

0 0
原创粉丝点击