如何检查对象在JavaScript中是否有任何属性?

Ric*_*cky 152 javascript

假设我宣布

var ad = {}; 
Run Code Online (Sandbox Code Playgroud)

如何检查此对象是否包含任何用户定义的属性?

Dha*_*ary 142

您可以使用内置Object.keys方法获取对象上的键列表并测试其长度.

var x = {};
// some code where value of x changes and than you want to check whether it is null or some object with values

if(Object.keys(x).length > 0){
 // Your code here if x has some properties  
}
Run Code Online (Sandbox Code Playgroud)

  • _这就在这里_是正确的答案.上面接受的答案是解决方法,并且比检查按键数量更昂贵; 这使得_way更有意义_. (10认同)
  • Object.keys( "MyString的"); 产生密钥也是我认为不可取的.在我看来,这个答案是不完整的. (5认同)
  • @DhavalChaudhary感谢您对我的评论的回复。当我尝试这段代码时,`var str =“ MyString”; Object.keys(str);`,控制台为每个字符输出0到7之间的8个键。还是我还是不明白答案。 (3认同)
  • @MikedeKlerk,但这仅是对象的解决方案,而不是字符串,请参考问题。 (3认同)
  • @MikedeKlerk请仔细阅读,它不是Object.keys(“ mystring”); 它是Object.keys(objectVariableName),它将返回object中所有键的数组。例如:{'x':'abc','y':'def'}它将是['x','y'] (2认同)

CMS*_*CMS 110

怎么做一个简单的功能?

function isEmptyObject(obj) {
  for(var prop in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, prop)) {
      return false;
    }
  }
  return true;
}

isEmptyObject({}); // true
isEmptyObject({foo:'bar'});  // false
Run Code Online (Sandbox Code Playgroud)

hasOwnProperty方法调用直接上Object.prototype只加一点更安全,试想使用正常以下obj.hasOwnProperty(...)电话:

isEmptyObject({hasOwnProperty:'boom'});  // false
Run Code Online (Sandbox Code Playgroud)

注意:( 以后) 上面的方法依赖于for...in语句,并且此语句仅针对可枚举属性进行迭代,在当前最广泛实现的ECMAScript标准(第3版)中,程序员无法创建不可枚举的属性. .

但是现在ECMAScript第5版已经改变了,我们可以创建不可枚举,不可写或不可删除的属性,因此上述方法可能会失败,例如:

var obj = {};
Object.defineProperty(obj, 'test', { value: 'testVal', 
  enumerable: false,
  writable: true,
  configurable: true
});
isEmptyObject(obj); // true, wrong!!
obj.hasOwnProperty('test'); // true, the property exist!!
Run Code Online (Sandbox Code Playgroud)

ECMAScript 5解决这个问题的方法是:

function isEmptyObject(obj) {
  return Object.getOwnPropertyNames(obj).length === 0;
}
Run Code Online (Sandbox Code Playgroud)

Object.getOwnPropertyNames方法返回一个Array包含的名字自己的属性的对象,而枚举与否,是由浏览器厂商现在实现了这个方法,它已经在Chrome 5 Beta版和最新的WebKit的每晚构建.

Object.defineProperty 也适用于那些浏览器和最新的Firefox 3.7 Alpha版本.

  • @Casey,编辑,如果一个对象覆盖`hasOwnProperty`属性,该函数可能会崩溃...我知道我有点偏执...但有时你不知道你的代码将在哪种环境中使用,但你知道你想用什么方法...... (3认同)
  • 回答这个问题的+1 ......以及未来的其他问题!:) (2认同)

Dan*_*llo 79

您可以循环遍历对象的属性,如下所示:

for(var prop in ad) {
    if (ad.hasOwnProperty(prop)) {
        // handle prop as required
    }
}
Run Code Online (Sandbox Code Playgroud)

使用该hasOwnProperty()方法很重要,以确定对象是否具有指定属性作为直接属性,而不是从对象的原型链继承.

编辑

从评论: 您可以将该代码放在一个函数中,并在它到达有注释的部分时返回false

性能测试

测试Object.Keys vs For..In测试任何属性时

  • 我认为现在使用`Object.keys`将是最简单的:`var a = [1,2,3]; a.something = 4; console.log(Object.keys(a))`因为它已经是ECMA 5你可以安全地填充它:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys#Compatibility (8认同)
  • @Ricky:您可以将该代码放在一个函数中,并在它到达有注释的部分时返回false. (7认同)
  • 嗨丹尼尔,实际上我正在寻找一种设备来检查对象是否包含用户定义的属性.不检查是否存在特定属性. (2认同)
  • 请注意,"当今"使用ES5,本机对象可以具有不可枚举的自有属性,例如`Object.defineProperty(obj,'foo',{enumerable:false,value:'foo'})`. (2认同)
  • 这个解决方案是一种_check现有密钥的方法,但真正的,有效的,最正确的答案是使用Object.keys(x).length.你不需要自己创造一个功能,一个已经存在! (2认同)
  • @dudewad - 仅当浏览器不创建新数组时,“Object.keys”才“高效”。性能测试 - 最近添加的比您的评论 - 显示上面的功能更快。OTOH 我同意使用内置函数通常比发明自己的函数更可取;实际上,性能差异可能并不重要。 (2认同)

kay*_*yz1 57

使用jQuery,您可以使用:

$.isEmptyObject(obj); // Returns: Boolean
Run Code Online (Sandbox Code Playgroud)

从jQuery 1.4开始,此方法检查对象本身的属性和从原型继承的属性(因为它不使用hasOwnProperty).

随着ECMAScript的第5版的现代浏览器(IE9 +,FF4 +,Chrome5 +,Opera12 +,Safari5 +),你可以使用内置的Object.keys方法:

var obj = { blah: 1 };
var isEmpty = !Object.keys(obj).length;
Run Code Online (Sandbox Code Playgroud)

或普通的旧JavaScript:

var isEmpty = function(obj) {
               for(var p in obj){
                  return false;
               }
               return true;
            };
Run Code Online (Sandbox Code Playgroud)


Zap*_*ree 30

最新的浏览器(和node.js)支持Object.keys(),它返回一个包含对象文字中所有键的数组,因此您可以执行以下操作:

var ad = {}; 
Object.keys(ad).length;//this will be 0 in this case
Run Code Online (Sandbox Code Playgroud)

浏览器支持:Firefox 4,Chrome 5,Internet Explorer 9,Opera 12,Safari 5

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys


Gru*_*nny 12

如果您正在使用underscore.js,那么您可以使用_.isEmpty函数:

var obj = {};
var emptyObject = _.isEmpty(obj);
Run Code Online (Sandbox Code Playgroud)


sfs*_*sfs 9

如果您愿意使用lodash,则可以使用该some方法.

_.some(obj) // returns true or false
Run Code Online (Sandbox Code Playgroud)

看到这个小jsbin的例子


Cas*_*Chu 5

for (var hasProperties in ad) break;
if (hasProperties)
    ... // ad has properties
Run Code Online (Sandbox Code Playgroud)

如果您必须确保安全并检查对象原型(这些是由某些库添加的,默认情况下不存在):

var hasProperties = false;
for (var x in ad) {
    if (ad.hasOwnProperty(x)) {
        hasProperties = true;
        break;
    }
}
if (hasProperties)
    ... // ad has properties
Run Code Online (Sandbox Code Playgroud)