最高半折刷qq各种业务和钻(家里人自己开的,尽管放心,大家多捧捧场)

sking7

导航

(转)Object.keys

纯属转帖:http://www.cnblogs.com/rubylouvre/archive/2011/12/24/2299860.html

abcd的实现:

var obj = {
    a:1,
    b:2,
    c:3
}
function keys(obj){
    var a = [], i = 0;
    for(a[i++] in obj);
    return a ;
}
console.log(keys(obj))

灰大的实现:

var obj = {
    a:1,
    b:2,
    c:3
}
function keys(obj){
    var a = [];
    for(a[a.length] in obj);
    return a ;
}
console.log(keys(obj))
    
 

好疯狂吧,用到for ( LeftHandSideExpression in Expression ) Statement 。我也不清楚,自己查ECMA。但我知道这实现是有问题的,Object.keys 只收集自身属性名,不收集继承自原型链上的。加之,IE6下对Object的一系列属性是不可遍历的,这时我们还要修正一下。下面才是正确的实现:

    var DONT_ENUM =  "propertyIsEnumerable,isPrototypeOf,hasOwnProperty,toLocaleString,toString,valueOf,constructor".split(","),
    hasOwn = ({}).hasOwnProperty;
    for (var i in {
        toString: 1
    }){
        DONT_ENUM = false;
    }
 
    Object.keys = Object.keys || function(obj){//ecma262v5 15.2.3.14
            var result = [];
            for(var key in obj ) if(hasOwn.call(obj,key)){
                result.push(key)
            }
            if(DONT_ENUM && obj){
                for(var i = 0 ;key = DONT_ENUM[i++]; ){
                    if(hasOwn.call(obj,key)){
                        result.push(key);
                    }
                }
            }
            return result;
        };

posted on 2011-12-25 10:50  G.N&K  阅读(286)  评论(0编辑  收藏  举报