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

如何检查对象在JavaScript中是否有任何属性?,javascript,Javascript,假设我申报 var ad = {}; 如何检查此对象是否包含任何用户定义的属性 for(var memberName in ad) { //Member Name: memberName //Member Value: ad[memberName] } Member是指成员属性、成员变量,无论您如何称呼它>\u> 上面的代码将返回所有内容,包括toString。。。 如果只想查看对象的原型是否已扩展: var dummyObj = {}; for(var memberName

假设我申报

var ad = {}; 
如何检查此对象是否包含任何用户定义的属性

for(var memberName in ad)
{
  //Member Name: memberName
  //Member Value: ad[memberName]
}
Member是指成员属性、成员变量,无论您如何称呼它>\u>

上面的代码将返回所有内容,包括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的成员类型应为“未定义”

您可以按如下方式循环对象的属性:

for(var prop in ad) {
    if (ad.hasOwnProperty(prop)) {
        // handle prop as required
    }
}
使用该方法确定对象是否将指定属性作为直接属性,而不是从对象的原型链继承,这一点很重要

编辑 从注释:您可以将该代码放入函数中,并使其在到达注释所在部分时返回false

如果必须确保安全并检查对象原型(这些原型由某些库添加,默认情况下不在库中):


做一个简单的函数怎么样

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…in
语句,并且该语句仅迭代可枚举属性,在当前实施最广泛的ECMAScript标准(第三版)中,程序员没有任何方法创建不可枚举属性

但是,这一点现在已经改变,我们可以创建不可枚举、不可写或不可删除的属性,因此上述方法可能会失败,例如:

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
方法返回一个
数组
,该数组包含对象自身所有属性的名称,无论是否可枚举,这个方法现在由浏览器供应商实现,它已经在Chrome 5测试版和最新的WebKit夜间版本中出现


Object.defineProperty
在这些浏览器和最新的Firefox 3.7 Alpha版本上也可用。

当确定对象是用户定义的对象时,确定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:
!不要在浏览器定义的对象上使用它。

稍后回答,但有些框架将对象作为可枚举项处理。因此,我们可以这样做:

var objToTest = {};
var propertyCount = bob.collections.extend(objToTest).count();

使用jQuery可以使用:

$.isEmptyObject(obj); // Returns: Boolean
从jQuery1.4开始,这个方法检查对象本身的属性和从原型继承的属性(因为它不使用hasOwnProperty)

在现代浏览器(IE9+、FF4+、Chrome5+、Opera12+、Safari5+)中,使用ECMAScript第5版可以使用内置方法:

或者简单的旧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


如果您使用的是下划线.js,则可以使用以下功能:

var obj = {};
var emptyObject = _.isEmpty(obj);
如果您愿意使用,可以使用
some
方法

_.some(obj) // returns true or false
看到这个小箱子了吗


简单,适用于每个浏览器,即使从技术上讲它是对象上所有关键点的循环,它也会而不是在所有关键点之间循环…要么有0,循环不运行,要么有一些,循环在第一个关键点之后中断(因为我们只检查是否有任何关键点…为什么要继续?)

您可以使用以下功能:

var ad = {}; 
Object.keys(ad).length;//this will be 0 in this case
双重爆炸!!属性查找

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操作符:

您可以使用内置的
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){
 // Your code here if x has some properties  
}

回答得很晚,但这是您可以用原型处理它的方式

Array.prototype.Any = function(func) {
    return this.some(func || function(x) { return x });
}

Object.prototype.IsAny = function() {
    return Object.keys(this).Any();
}
这个怎么样

var obj = {},
var isEmpty = !obj;
var hasContent = !!obj

ES6功能

/**
*如果对象为空,则返回true。
*@param{*}obj要测试的对象
*@return{boolean}如果对象为空,则返回true,否则返回false
*/
const pureObjectSempty=obj=>obj&&obj.constructor==Object&&Object.keys(obj)。长度==0
示例:


let obj=“这是一个具有字符串构造函数的对象”
console.log(pureObjectSempty(obj))//是否为空?真的
obj={}
console.log(pureObjectSempty(obj))//是否为空?真的
obj=[]
console.log(pureObjectSempty(obj))//是否为空?真的
obj=[{prop:“值”}]
console.log(pureObjectSempty(obj))//是否为空?真的
obj={prop:“值”}
console.log(pureObjectSempty(obj))//是否为空?假的

Hi,我能知道一个对象是否包含属性吗?感谢您的解决方案没有过滤不需要的原型属性,这意味着当使用prototype.js之类的库或未经经验的用户向对象添加其他原型属性时,可能会出现错误。请在此页面上查看Daniels解决方案-它不太容易出错!您的第一个代码块根本没有涵盖它。如果我向未定义的“ad”对象添加变量,则第二个代码块会出现错误。真的,看看Daniels的答案,这是唯一正确且快速的方法,因为它使用了一个名为“h”的本地实现
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  
}
Array.prototype.Any = function(func) {
    return this.some(func || function(x) { return x });
}

Object.prototype.IsAny = function() {
    return Object.keys(this).Any();
}
var obj = {},
var isEmpty = !obj;
var hasContent = !!obj