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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值