假设我宣布
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版本上也可用。
其他回答
你可以使用内置的Object。方法获取对象上的键列表并测试其长度。
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){
// Your code here if x has some properties
}
你可以使用以下方法:
两声巨响!!属性查询
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.
typeof
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");
}
结果:
Name存在于myObject中
下面是一个关于in操作符的更详细的链接:确定一个对象属性是否存在
大多数最近的浏览器(和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
for(var memberName in ad)
{
//Member Name: memberName
//Member Value: ad[memberName]
}
成员是指成员属性,成员变量,你可以叫它>_>
上面的代码将返回EVERYTHING,包括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:我们检查虚拟对象的成员是否与测试对象的成员具有相同的类型。如果它是一个扩展,dummyobject的成员类型应该是"undefined"
对象。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