zoukankan      html  css  js  c++  java
  • 奇技淫巧之Object.keys

    今天在群里看到两个keys函数实现

    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的一系列属性是不可遍历的,这时我们还要修正一下。下面才是正确的实现:

    // by 司徒正美 https://github.com/RubyLouvre/mass-Framework/blob/master/browers/lang.js
        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;
            };
    
  • 相关阅读:
    装配线调度
    最长非降子序列
    0-1背包问题
    所有点对的最短路径问题
    矩阵链相乘
    最长公共子序列
    最近点对问题
    寻找多数元素
    寻找第K小元素
    java冒泡排序算法
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/2299860.html
Copyright © 2011-2022 走看看