• 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 );
        }
    }
  • 相关阅读:
    [WF4.0 实战] AutoResetEvent具体解释(线程独占訪问资源)
    linux下getrlimit与sysconf函数
    36.怎样使用定时任务
    1016. 部分A+B (15)
    找你妹+ipad+wifi,回顾那年的经典游戏
    Oracle 外键约束子表、父表
    字符串 上
    LeetCode103 BinaryTreeZigzagLevelOrderTraversal(二叉树Z形层次遍历) Java题解
    jquery ajax參数加点号状态200进error
    泛型数组随机排列工具类
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5663378.html
Copyright © 2020-2023  润新知