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

2020/10/23 22:42 · javascript ·  · 0评论

假设我宣布

var ad = {}; 

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

您可以如下遍历对象的属性:

for(var prop in ad) {
    if (ad.hasOwnProperty(prop)) {
        // handle prop as required
    }
}

使用该hasOwnProperty()方法确定对象是否具有指定的属性作为直接属性,而不是继承自对象的原型链,这一点很重要

编辑

从注释中: 您可以将该代码放入函数中,并在到达注释的部分后立即使它返回false。

性能测试

测试任何属性时测试Object.Keys与For..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 > 0){
 // Your code here if x has some properties  
}

做一个简单的函数呢?

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 Standard(第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包含的名字自己的属性的对象,而枚举与否,现在正在实施的浏览器厂商这种方法,它已经在Chrome 5 Beta版和最新的WebKit的每晚构建。

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

使用jQuery,您可以使用:

$.isEmptyObject(obj); // Returns: Boolean

从jQuery 1.4开始,此方法同时检查对象本身的属性和从原型继承的属性(因为它不使用hasOwnProperty)。

使用现代浏览器(IE9 +,FF4 +,Chrome5 +,Opera12 +,Safari5 +)中的ECMAScript 5th Edition,您可以使用内置的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;
            };

最新的浏览器(和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/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

如果您使用的是underscore.js,则可以使用_.isEmpty函数:

var obj = {};
var emptyObject = _.isEmpty(obj);

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

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

看到这个小jsbin示例

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
for(var memberName in ad)
{
  //Member Name: memberName
  //Member Value: ad[memberName]
}

成员表示成员属性,成员变量,无论您想调用什么> _>

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

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和循环不运行或有一些它的第一爆发后一个(因为我们要检查的是是否有任何东西……为什么要继续?)

答案很晚,但这是您可以使用原型处理的方式。

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

Object.prototype.IsAny = function() {
    return Object.keys(this).Any();
}

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

当确定对象是用户定义的对象时,确定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 

ps:请勿在浏览器定义的对象上使用它。

答案很晚,但是有些框架将对象作为可枚举的对象来处理。因此,bob.js可以这样做:

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

您可以使用以下内容:

双砰!属性查询

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中的prop

var myObject = {
  name: 'John',
  address: null,
  developer: false
};
'developer' in myObject; // true, remember it's looking for exists, not value.

类型

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运算符的详细链接:确定对象属性是否存在

这个怎么样?

var obj = {},
var isEmpty = !obj;
var hasContent = !!obj
本文地址:http://javascript.askforanswer.com/ruhejianchaduixiangzaijavascriptzhongshifoujuyourenheshuxing.html
文章标签:
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!