如何检查对象是否有任何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.prototype
的hasOwnProperty
方法只是增加了一点安全性 ,想象下面使用正常的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
有两种方法可以做到这一点:
- propj在obj中
- 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
希望这可以帮助。