谈谈js中for in 需要注意的地方
2014-10-31 17:45
323 查看
js中for in 可以遍历对象或数组的显性属性,也就是说我们自己定义的属性是可以遍历的,那些原型上默认已有的属性,例如:Object.prototype.toString、Object.prototype.hasOwnProperty 是遍历不出来的。
for in 的基本规则如上,不过还有“坑”的地方需要我们注意:
1、for in循环出的值不一定是按顺序的。代码如下:
低版本浏览器弹窗的顺序是:1、2、3。现代浏览器弹窗的顺序是1、3、2。
2、在原型上加扩展方法,会被for in 出来。代码如下:
我们手动加在原型上的方法,for in的时候会被遍历出来。一般我们遍历对象并不需要其原型的属性,所以遍历时最好Object.prototype.hasOwnProperty方法进行判断。
3、在实例中定义原型中已有的方法,浏览器for in 情况不一致。代码如下:
我们给b实例加了一个原型上已有的方法toString。现代浏览器能循环出toString 低版本浏览器却不能。所以给实例定属性名时,不要和原型已有的一致。
4、各浏览器循环出的属性顺序不同。代码与2中的一样:
现代浏览器先循环实例中的属性,再循环原型中的属性。低版本浏览器相反。
这让我想到了jQuery对$.isPlainObject()方法实现的一段代码:
它这里说如果一个对象的最后一个属性是实例自己的属性,那么所有的属性都是实例自己的属性。这对低版本浏览器来说应该是不对的。所以jquery后来又加了如下代码修复:
最后想吐槽一下,一般不要在原型上加自定义方法;数组的循环一般不用for in 。哈哈!
for in 的基本规则如上,不过还有“坑”的地方需要我们注意:
1、for in循环出的值不一定是按顺序的。代码如下:
var b = {3:1,42:2,11:3} for( var key in b ){ alert( b[key] ) }
低版本浏览器弹窗的顺序是:1、2、3。现代浏览器弹窗的顺序是1、3、2。
2、在原型上加扩展方法,会被for in 出来。代码如下:
Object.prototype.test = "I am test" var b = {"name":"txj"} for( var key in b ){ alert(key + " : "+ b[key]) }
我们手动加在原型上的方法,for in的时候会被遍历出来。一般我们遍历对象并不需要其原型的属性,所以遍历时最好Object.prototype.hasOwnProperty方法进行判断。
3、在实例中定义原型中已有的方法,浏览器for in 情况不一致。代码如下:
var b = {"name":"txj"} b.toString = function(){ alert("I am toString") } for( var key in b ){ alert(key + " : "+ b[key]) }
我们给b实例加了一个原型上已有的方法toString。现代浏览器能循环出toString 低版本浏览器却不能。所以给实例定属性名时,不要和原型已有的一致。
4、各浏览器循环出的属性顺序不同。代码与2中的一样:
Object.prototype.test = "I am test" var b = {"name":"txj"} for( var key in b ){ alert(key + " : "+ b[key]) }
现代浏览器先循环实例中的属性,再循环原型中的属性。低版本浏览器相反。
这让我想到了jQuery对$.isPlainObject()方法实现的一段代码:
// Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. var key for ( key in obj ) {} return key === undefined || hasOwn.call( obj, key );
它这里说如果一个对象的最后一个属性是实例自己的属性,那么所有的属性都是实例自己的属性。这对低版本浏览器来说应该是不对的。所以jquery后来又加了如下代码修复:
// Support: IE<9 // Handle iteration over inherited properties before own properties. if ( support.ownLast ) { for ( key in obj ) { return hasOwn.call( obj, key ); } }
最后想吐槽一下,一般不要在原型上加自定义方法;数组的循环一般不用for in 。哈哈!
相关文章推荐
- js基础-需要注意的地方
- html页面触发js里面的方法时,传递的参数写法需要注意的地方。
- js 基本的数据类型(boolean需要注意的地方)
- JS一些需要注意的地方
- [js高手之路]使用原型对象(prototype)需要注意的地方
- js使用原型对象(prototype)需要注意的地方
- 在ascx中使用js做验证时需要注意的小地方.
- js的时间戳和php的时间戳转换需要注意的地方
- js拼的onclick调用方法需要注意的地方 之二
- 初学js需要注意的地方
- [js高手之路]使用原型对象(prototype)需要注意的地方
- 关于js的核心笔记--需要注意的地方都在这里啦,有测试代码
- js需要注意的地方
- js常用函数之需要注意的地方
- js:使用ajax作为判断条件时 需要注意的地方
- [js高手之路]使用原型对象(prototype)需要注意的地方
- [js高手之路]使用原型对象(prototype)需要注意的地方
- 引入JS需要注意的地方
- [js高手之路]使用原型对象(prototype)需要注意的地方
- js 编程风格指南:开发需要注意的地方