zoukankan      html  css  js  c++  java
  • Object.keys() https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

    Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用for...in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-in 循环还会枚举其原型链上的属性)。

    语法

    Object.keys(obj)
    

    参数

    obj
    要返回其枚举自身属性的对象。

    返回值

    一个表示给定对象的所有可枚举属性的字符串数组。

    描述

    Object.keys 返回一个所有元素为字符串的数组,其元素来自于从给定的对象上面可直接枚举的属性。这些属性的顺序与手动遍历该对象属性时的一致。

    例子

    /* Array 对象 */ 
    let arr = ["a", "b", "c"];
    console.log(Object.keys(arr)); 
    // ['0', '1', '2']
    
    /* Object 对象 */ 
    let obj = { foo: "bar", baz: 42 }, 
        keys = Object.keys(obj);
    // CCAC: Chrome Console Auto Copy
    copy(keys); 
    // ["foo","baz"]
    
    
    
    /* 类数组 对象 */ 
    let obj = { 0 : "a", 1 : "b", 2 : "c"};
    console.log(Object.keys(obj)); 
    // ['0', '1', '2']
    
    // 类数组 对象, 随机 key 排序 
    let anObj = { 100: 'a', 2: 'b', 7: 'c' }; 
    
    console.log(Object.keys(anObj)); 
    // ['2', '7', '100']
    
    /* getFoo 是个不可枚举的属性 */ 
    var my_obj = Object.create(
       {}, 
       { getFoo : { value : function () { return this.foo } } }
    );
    my_obj.foo = 1;
    
    console.log(Object.keys(my_obj)); 
    // ['foo']

    如果你想获取一个对象的所有属性,,甚至包括不可枚举的,请查看Object.getOwnPropertyNames

    注意

    在ES5里,如果此方法的参数不是对象(而是一个原始值),那么它会抛出 TypeError。在ES2015中,非对象的参数将被强制转换为一个对象。

    Object.keys("foo");
    // TypeError: "foo" is not an object (ES5 code)
    
    Object.keys("foo");
    // ["0", "1", "2"]                   (ES2015 code)

    Polyfill

    要在原生不支持的旧环境中添加兼容的 Object.keys,请复制以下代码段:

    if (!Object.keys) {
      Object.keys = (function () {
        var hasOwnProperty = Object.prototype.hasOwnProperty,
            hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
            dontEnums = [
              'toString',
              'toLocaleString',
              'valueOf',
              'hasOwnProperty',
              'isPrototypeOf',
              'propertyIsEnumerable',
              'constructor'
            ],
            dontEnumsLength = dontEnums.length;
    
        return function (obj) {
          if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');
    
          var result = [];
    
          for (var prop in obj) {
            if (hasOwnProperty.call(obj, prop)) result.push(prop);
          }
    
          if (hasDontEnumBug) {
            for (var i=0; i < dontEnumsLength; i++) {
              if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
            }
          }
          return result;
        }
      })()
    };

    上面的代码在IE7(也许IE8也是)下有个问题,就是如果传入一个来自其他 window 对象下的对象时,不可枚举的属性也会获取到。

    另一个简单点的实现方法,来自 Javascript - Object.keys Browser Compatibility

    规范

    SpecificationStatusComment
    ECMAScript 5.1 (ECMA-262)
    Object.keys
    Standard Initial definition.
    Implemented in JavaScript 1.8.5
    ECMAScript 2015 (6th Edition, ECMA-262)
    Object.keys
    Standard  
    ECMAScript Latest Draft (ECMA-262)
    Object.keys
    Living Standard  

    浏览器兼容性

    FeatureChromeEdgeFirefox (Gecko)Internet ExplorerOperaSafari
    Basic support 5 (Yes) 4.0 (2.0) 9 12 5

    相关链接

  • 相关阅读:
    Python partition() 方法
    汽车车灯灯具系统(下)
    汽车车灯灯具系统(上)
    语义和边缘:从噪声和符号中学习
    AI解决方案:边缘计算和GPU加速平台
    GPU与显卡
    图像处理 100 问!!
    匹配算法:局部结构保留
    图像拼接技术
    SLAM的通用框架:GSLAM
  • 原文地址:https://www.cnblogs.com/yanan-boke/p/7771285.html
Copyright © 2011-2022 走看看