mozilla
您的搜索结果

    keys

    概述

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

    语法

    Object.keys(obj)

    参数

    obj
    返回该对象的所有可枚举自身属性的属性名。

    描述

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

    例子

    var arr = ["a", "b", "c"];
    alert(Object.keys(arr)); // 弹出"0,1,2"
    
    // 类数组对象
    var obj = { 0 : "a", 1 : "b", 2 : "c"};
    alert(Object.keys(obj)); // 弹出"0,1,2"
    
    // getFoo是个不可枚举的属性
    var my_obj = Object.create({}, { getFoo : { value : function () { return this.foo } } });
    my_obj.foo = 1;
    
    alert(Object.keys(my_obj)); // 只弹出foo
    

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

    兼容旧环境

    运行下面的代码可以兼容那些没有原生支持Object.key方法的JavaScript环境。

    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

    if (!Object.keys) Object.keys = function(o) {
      if (o !== Object(o))
        throw new TypeError('Object.keys called on a non-object');
      var k=[],p;
      for (p in o) if (Object.prototype.hasOwnProperty.call(o,p)) k.push(p);
      return k;
    }
    

    规范

    Specification Status Comment
    ECMAScript 5.1 (ECMA-262)
    Object.keys
    Standard Initial definition.
    Implemented in JavaScript 1.8.5
    ECMAScript 6 (ECMA-262)
    Object.keys
    Draft  

    浏览器兼容性

    Feature Firefox (Gecko) Chrome Internet Explorer Opera Safari
    Basic support 4 (2.0) 5 9 12 5
    Feature Firefox Mobile (Gecko) Android IE Mobile Opera Mobile Safari Mobile
    Basic support ? ? ? ? ?

    相关链接

    文档标签和贡献者

    此页面的贡献者有: ziyunfei, AlexChao, teoli
    最后编辑者: AlexChao,