javascript代码实例教程-谈谈js中for in 需要注意的地方

发布时间:2019-01-22 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了javascript代码实例教程-谈谈js中for in 需要注意的地方脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
小宝典致力于为广大程序猿(媛)提供高品质的代码服务,请大家多多光顾小站,小宝典在此谢过。 js中for in 可以遍历对象或数组的显性属性,也就是说我们自己定义的属性是可以遍历的,那些原型上默认已有的属性,例如:Object.PRototyPE.toString、Object.prototype.hasOwnProperty 是遍历不出来的。

 

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 );

    }

}

觉得可用,就经常来吧! 脚本宝典 欢迎评论哦! js脚本,巧夺天工,精雕玉琢。小宝典献丑了!

脚本宝典总结

以上是脚本宝典为你收集整理的javascript代码实例教程-谈谈js中for in 需要注意的地方全部内容,希望文章能够帮你解决javascript代码实例教程-谈谈js中for in 需要注意的地方所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。