• 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 );
        }
    }
  • 相关阅读:
    《C# to IL》第一章 IL入门
    multiple users to one ec2 instance setup
    Route53 health check与 Cloudwatch alarm 没法绑定
    rsync aws ec2 pem
    通过jvm 查看死锁
    wait, notify 使用清晰讲解
    for aws associate exam
    docker 容器不能联网
    本地运行aws lambda credential 配置 (missing credential config error)
    Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5663378.html
Copyright © 2020-2023  润新知