如何检查对象在JavaScript中是否有任何属性?

时间:2010-04-20 06:44:17

标签: javascript

假设我宣布

var ad = {}; 

如何检查此对象是否包含任何用户定义的属性?

16 个答案:

答案 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)

如果您愿意使用lodash,则可以使用some方法。

_.some(obj) // returns true or false

请参阅此小jsbin example

答案 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。

我认为这是最好的方式。

运营商

中的

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运算符:Determining if an object property exists

答案 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