我怎么知道一个物体是空白的?

How can I tell if an object is blank?

本文关键字:空白 一个 我怎么知道      更新时间:2023-09-26

如果我使用:

var a = {};

var a = new Object();

如果我不知道具体要测试什么,如何测试它是否包含任何内容呢?

(类似于a =={},但这不能正确求值)

您可以使用这个简单的函数:

function isEmpty(object) {
    for(var property in object) {
        if(object.hasOwnProperty(property))
            return false;
    }
    return true;
}

但是如果你使用jQuery: http://api.jquery.com/jQuery.isEmptyObject/

这似乎是一个无辜的问题,@SiteSafeNL提供的一个简单的解决方案似乎可以工作,但是有一个实现错误没有被考虑在内,IE {DontEnum}错误。

如果你的目标是IE8及以下版本,你需要实现这样的东西:

var isEmpty = (function () {
    var hasOwn = Object.prototype.hasOwnProperty,
        hasDontEnumBug = !{toString:0}.propertyIsEnumerable("toString"),
        dontEnums = ['toString', 'toLocaleString',
            'valueOf', 'hasOwnProperty',
            'isPrototypeOf', 'propertyIsEnumerable',
            'constructor'];

    return function (o) {
        for (var p in o) {
            if (hasOwn.call(o, p))
                return false
        }
        if (hasDontEnumBug) { // IE8 and below
            var i = dontEnums.length;
            while(i--) {
                if (hasOwn.call(o, dontEnums[i]))
                    return false;
            }
        }
        return true;
    };
})();

现在在实现ECMAScript 5的现代浏览器中,正如@Alnitak提到的,你可以使用Object.keys,但在ES5中,现在我们有了定义不可枚举属性的能力,这些属性不会出现在for-in循环中,如果你需要检测它们,你必须使用替代方法,例如,使用上面的函数,或Object.keys:

var obj = Object.create(null, { foo: { value: 1, /* enumerable:false... */} });
isEmpty(obj); // true
Object.keys(obj).length; // 0
// But the property exists:
obj.hasOwnProperty('foo'); // true
obj.foo; // 1

如果您想捕获不可枚举的自身属性,我们需要另一种方法,这就是Object.getOwnPropertyNames方法存在的原因:

function isEmpty(obj) {
  return Object.getOwnPropertyNames(obj).length == 0;
}

在ECMAScript 5中可以使用:

if (Object.keys(a).length === 0) {
    ...
}

注意:这只会找到可枚举的属性。