假设我宣布
var ad = {};
如何检查此对象是否包含任何用户定义的属性?
您可以使用内置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 }
怎么做一个简单的功能?
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
该hasOwnProperty
方法调用直接上Object.prototype
只加一点更安全,试想使用正常以下obj.hasOwnProperty(...)
电话:
isEmptyObject({hasOwnProperty:'boom'}); // false
注意:( 以后) 上面的方法依赖于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!!
ECMAScript 5解决这个问题的方法是:
function isEmptyObject(obj) { return Object.getOwnPropertyNames(obj).length === 0; }
该Object.getOwnPropertyNames
方法返回一个Array
包含的名字都在自己的属性的对象,而枚举与否,是由浏览器厂商现在实现了这个方法,它已经在Chrome 5 Beta版和最新的WebKit的每晚构建.
Object.defineProperty
也适用于那些浏览器和最新的Firefox 3.7 Alpha版本.
您可以循环遍历对象的属性,如下所示:
for(var prop in ad) { if (ad.hasOwnProperty(prop)) { // handle prop as required } }
使用该hasOwnProperty()
方法很重要,以确定对象是否具有指定属性作为直接属性,而不是从对象的原型链继承.
从评论: 您可以将该代码放在一个函数中,并在它到达有注释的部分时返回false
性能测试
测试Object.Keys vs For..In测试任何属性时
使用jQuery,您可以使用:
$.isEmptyObject(obj); // Returns: Boolean
从jQuery 1.4开始,此方法检查对象本身的属性和从原型继承的属性(因为它不使用hasOwnProperty).
随着ECMAScript的第5版的现代浏览器(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; };
最新的浏览器(和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的例子