假设我宣布
var ad = {};
如何检查此对象是否包含任何用户定义的属性?
答案 0 :(得分:110)
您可以使用内置的var text = "<html>\n<meta class='a'/>\n<meta class='b'/>\n<div>\n<p>test</p>\n</div>\n</html>"
var tag = "meta";
var re = new RegExp("<(\/)?" + tag + ".*?>", "gm")
var matches = text.match(re)
text.split(re).reduce( (p,c) => {
(!c) ? p.push(matches.shift()) : p.push(c);
return p;
}, [])
方法获取对象上的键列表并测试其长度。
{{1}}
答案 1 :(得分:109)
制作简单的功能怎么样?
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 5th Edition,我们可以创建不可枚举,不可写或不可删除的属性,因此上述方法可能失败,例如:
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
,其中包含所有对象的自己的属性的名称,可枚举或不< / em>,这种方法现在由浏览器供应商实现,它已经在Chrome 5 Beta和最新的WebKit Nightly Builds上。
Object.defineProperty
也适用于这些浏览器和最新的Firefox 3.7 Alpha版本。
答案 2 :(得分:75)
您可以按如下方式遍历对象的属性:
for(var prop in ad) {
if (ad.hasOwnProperty(prop)) {
// handle prop as required
}
}
使用hasOwnProperty()
方法来确定对象是否具有指定属性作为直接属性,而不是从对象的原型链继承,这一点非常重要。
来自评论: 您可以将该代码放入一个函数中,并在它到达有注释的部分时返回false
效果测试
Test Of Object.Keys vs For..In When testing for any properties
答案 3 :(得分:54)
使用 jQuery ,您可以使用:
$.isEmptyObject(obj); // Returns: Boolean
从jQuery 1.4开始,此方法检查对象本身的属性和从原型继承的属性(因为它不使用hasOwnProperty)。
在现代浏览器(IE9 +,FF4 +,Chrome5 +,Opera12 +,Safari5 +)中使用 ECMAScript第5版,您可以使用内置的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;
};
答案 4 :(得分:29)
最近的浏览器(和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
答案 5 :(得分:11)
如果您使用的是underscore.js,则可以使用_.isEmpty函数:
var obj = {};
var emptyObject = _.isEmpty(obj);
答案 6 :(得分:8)
答案 7 :(得分:3)
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
答案 8 :(得分:2)
for(var memberName in ad)
{
//Member Name: memberName
//Member Value: ad[memberName]
}
会员是指会员财产,会员变量,无论您想要什么称呼&gt; _&gt;
以上代码将返回所有内容,包括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的成员类型应该是“未定义的”
答案 9 :(得分:0)
当确定对象是用户定义的对象时,确定UDO是否为空的最简单方法是以下代码:
isEmpty=
/*b.b Troy III p.a.e*/
function(x,p){for(p in x)return!1;return!0};
尽管这种方法(本质上)是演绎方法,但它是最快,最快的方法。
a={};
isEmpty(a) >> true
a.b=1
isEmpty(a) >> false
P.S .: !不要在浏览器定义的对象上使用它。
答案 10 :(得分:0)
迟到的答案,但有些框架将对象作为枚举处理。因此,bob.js可以这样做:
var objToTest = {};
var propertyCount = bob.collections.extend(objToTest).count();
答案 11 :(得分:0)
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并且循环没有运行或者有一些并且在第一个循环之后它会中断(因为我们所有人都在检查是否有任何...所以为什么要继续?)
答案 12 :(得分: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.
<强> typeof运算强>
if (typeof myObject.name !== 'undefined') {
// do something
}
但是,它不检查null。
我认为这是最好的方式。
运营商 中的
结果: myObject中存在名称 以下链接详细介绍了in运算符:Determining if an object property exists 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");
}
答案 13 :(得分:0)
答案很晚,但这就是您可以使用原型处理它的方式。
Array.prototype.Any = function(func) {
return this.some(func || function(x) { return x });
}
Object.prototype.IsAny = function() {
return Object.keys(this).Any();
}
答案 14 :(得分:0)
怎么样?
var obj = {},
var isEmpty = !obj;
var hasContent = !!obj
答案 15 :(得分:0)
ES6 功能
/**
* Returns true if an object is empty.
* @param {*} obj the object to test
* @return {boolean} returns true if object is empty, otherwise returns false
*/
const pureObjectIsEmpty = obj => obj && obj.constructor === Object && Object.keys(obj).length === 0
示例:
let obj = "this is an object with String constructor"
console.log(pureObjectIsEmpty(obj)) // empty? true
obj = {}
console.log(pureObjectIsEmpty(obj)) // empty? true
obj = []
console.log(pureObjectIsEmpty(obj)) // empty? true
obj = [{prop:"value"}]
console.log(pureObjectIsEmpty(obj)) // empty? true
obj = {prop:"value"}
console.log(pureObjectIsEmpty(obj)) // empty? false