假设我宣布
var ad = {};
如何检查该对象是否包含用户定义的属性?
假设我宣布
var ad = {};
如何检查该对象是否包含用户定义的属性?
当前回答
做一个简单的函数怎么样?
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方法。prototype只是为了增加一点安全性,想象一下下面使用一个普通的obj.hasOwnProperty(…)调用:
isEmptyObject({hasOwnProperty:'boom'}); // false
注:(for future)上述方法依赖于for…在语句中,这个语句只迭代可枚举的属性,在目前最广泛实现的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;
}
对象。getOwnPropertyNames方法返回一个数组,包含对象的所有属性的名称,可枚举或不可枚举,这个方法现在由浏览器供应商实现,它已经在Chrome 5 Beta和最新的WebKit Nightly Builds中。
Object.defineProperty在这些浏览器和最新的Firefox 3.7 Alpha版本上也可用。
其他回答
如果你愿意使用lodash,你可以使用some方法。
_.some(obj) // returns true or false
请看这个jsbin的小例子
你可以循环遍历对象的属性,如下所示:
for(var prop in ad) {
if (ad.hasOwnProperty(prop)) {
// handle prop as required
}
}
使用hasOwnProperty()方法来确定对象是否将指定的属性作为直接属性,而不是从对象的原型链继承,这很重要。
Edit
来自注释:您可以将该代码放入函数中,并使其在到达有注释的部分时立即返回false
如果你使用的是underscore.js,那么你可以使用_。isEmpty功能:
var obj = {};
var emptyObject = _.isEmpty(obj);
这个怎么样?
var obj = {},
var isEmpty = !obj;
var hasContent = !!obj
对象。hasOwn是一个新的静态方法(还不是所有浏览器都完全支持),它检查指定的对象是否有指定的属性作为自己的属性,如果是这样就返回true。如果该属性被继承或在该对象上不存在,则返回false。
您可以遍历对象属性并检查它们是否确实是自己的属性
for (let property in ad) {
if (Object.hasOwn(ad, property)) {
// handle your code for object own properties here
}
}
更多关于Object的信息。hasOwn - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/
浏览器兼容性在这里- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn#browser_compatibility