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

假设我宣布

var ad = {}; 

我怎样才能检查这个对象是否将包含任何用户定义的属性?

你可以循环你的对象的属性,如下所示:

 for(var prop in ad) { if (ad.hasOwnProperty(prop)) { // handle prop as required } } 

使用hasOwnProperty()方法来确定对象是否具有指定属性作为直接属性,而不是从对象的原型链inheritance是非常重要的。

编辑

从注释: 你可以把这个代码放在一个函数中,只要它到达有注释的地方就返回false

做一个简单的function呢?

 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 

直接调用Object.prototypehasOwnProperty方法只是增加了一点安全性 ,想象下面使用正常的obj.hasOwnProperty(...)调用:

 isEmptyObject({hasOwnProperty:'boom'}); // false 

注意:( 以后)上面的方法依赖于for...in语句,而且这个语句只是遍历可枚举的属性,在目前应用最广泛的ECMAScript标准(第3版)中,程序员没有任何办法创build不可枚举的属性。

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

 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!! 

这个问题的ECMAScript 5解决scheme将是:

 function isEmptyObject(obj) { return Object.getOwnPropertyNames(obj).length === 0; } 

Object.getOwnPropertyNames方法返回一个Array包含一个对象的所有 属性的名称,可以枚举或不可以枚举 ,这个方法现在被浏览器供应商实现,它已经在Chrome 5 Beta和最新的WebKit Nightly Builds上。

这些浏览器和最新的Firefox 3.7 Alpha版本也提供Object.defineProperty

jQuery你可以使用:

 $.isEmptyObject(obj); // Returns: Boolean 

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

在现代浏览器中使用ECMAScript 5th Edition (IE9 +,FF4 +,Chrome5 +,Opera12 +,Safari5 +),您可以使用内置的Object.keys方法:

 var obj = { blah: 1 }; var isEmpty = !Object.keys(obj).length; 

或简单的旧JavaScript:

 var isEmpty = function(obj) { for(var p in obj){ return false; } return true; }; 

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

 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 } 

最近的浏览器(和node.js)支持Object.keys(),它返回一个包含对象文本中所有键的数组,所以你可以这样做:

 var ad = {}; Object.keys(ad).length;//this will be 0 in this case 

浏览器支持: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

如果你使用的是underscore.js,那么你可以使用_.isEmpty函数:

 var obj = {}; var emptyObject = _.isEmpty(obj); 

如果你愿意使用lodash ,你可以使用some方法。

 _.some(obj) // returns true or false 

看到这个小jsbin的例子

 for(var memberName in ad) { //Member Name: memberName //Member Value: ad[memberName] } 

成员意味着成员属性,成员variables,无论你想调用它> _>

上面的代码将返回一切,包括toString …如果你只想看看对象的原型是否已经扩展:

 var dummyObj = {}; for(var memberName in ad) { if(typeof(dummyObj[memberName]) == typeof(ad[memberName])) continue; //note A //Member Name: memberName //Member Value: ad[memberName] } 

注意A:我们检查虚拟对象的成员是否与我们的testing对象成员具有相同的types。 如果是扩展,dummyobject的成员types应该是“undefined”

 for (var hasProperties in ad) break; if (hasProperties) ... // ad has properties 

如果你必须保证安全,并检查对象原型(这些是由某些库添加的,而不是默认的):

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

有两种方法可以做到这一点:

  1. propj在obj中
  2. obj.hasOwnProperty(PROPNAME)

但要注意的是:两者之间有很大的差别:

如果obj具有名为propName(obj.propName)的属性,则第一个将返回true ,但是如果obj没有find属性,它将继续prototype树中查找propName。 如果它会在那里find,expression式将返回true否则将返回false

第二个例子将检查对象本身而不检查其原型。 这很像迭代一个数组。

例:

 function Obj(){ this.a = undefined; this.b = null; this.c = false; } Obj.prototype = { d: true, e: true }; var obj = new Obj(); 

并testing它:

 "a" in obj // true "e" in obj // true obj.hasOwnProperty("a") // true obj.hasOwnProperty("e") // false 

确定该对象是用户定义的对象时,确定UDO是否为空的最简单的方法是以下代码:

 isEmpty= /*bb Troy III pae*/ function(x,p){for(p in x)return!1;return!0}; 

即使这种方法(本质上)是一个演绎的方法,它是最快和最快的。

 a={}; isEmpty(a) >> true ab=1 isEmpty(a) >> false 

ps:!不要在浏览器定义的对象上使用它。

迟到的答案,但一些框架处理对象作为枚举。 因此, bob.js可以这样做:

 var objToTest = {}; var propertyCount = bob.collections.extend(objToTest).count(); 
 var hasAnyProps = false; for (var key in obj) { hasAnyProps = true; break; } // as of this line hasAnyProps will show Boolean whether or not any iterable props exist 

简单,适用于每个浏览器,即使它在技术上是一个循环的对象上的所有键,它不会循环通过它们全部…或者有0和循环不运行,或者有一些,并在第一个一个(因为我们正在检查的是如果有任何…为什么继续?)

您可以使用以下内容:

双重砰! 财产查询

 var a = !![]; // true var a = !!null; // false 

hasOwnProperty这是我曾经使用过的东西:

 var myObject = { name: 'John', address: null }; if (myObject.hasOwnProperty('address')) { // true // do something if it exists. } 

但是,JavaScript决定不保护方法的名称,所以可能会被篡改。

 var myObject = { hasOwnProperty: 'I will populate it myself!' }; 

支持myObject

 var myObject = { name: 'John', address: null, developer: false }; 'developer' in myObject; // true, remember it's looking for exists, not value. 

types

 if (typeof myObject.name !== 'undefined') { // do something } 

但是,它不检查null。

我认为这是最好的方法。

在运营商

 var myObject = { name: 'John', address: null }; if('name' in myObject) { console.log("Name exists in myObject"); }else{ console.log("Name does not exist in myObject"); } 

结果:

名称存在于myObject中

这里是一个链接,更详细的in运算符: 确定是否存在一个对象属性

我写了2个可用于此的开源组件。 如果要检查对象是否具有某个用户指定的属性,可以使用此对象hasOwnPropert组件。 例子:

 hasOwnProperty({foo: 'bar'}, 'foo') // => true hasOwnProperty({foo: 'bar'}, 'bar') // => false 

要检查对象是否有任何属性(意思是空的),可以使用这个对象为空的组件 。

例子:

 empty([]) // => true empty({}) // => true empty(1) // => false empty('') // => false empty('foo') // => true 

希望这可以帮助。