Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我如何判断一个对象是否为空?_Javascript - Fatal编程技术网

Javascript 我如何判断一个对象是否为空?

Javascript 我如何判断一个对象是否为空?,javascript,Javascript,如果我使用以下命令设置对象: var a = {}; 或 如果我不知道具体测试什么,我如何测试它里面是否有任何东西 (类似于a={},但计算不正确)您可以使用以下简单函数: function isEmpty(object) { for(var property in object) { if(object.hasOwnProperty(property)) return false; } return true; } 但是如果

如果我使用以下命令设置对象:

var a = {};

如果我不知道具体测试什么,我如何测试它里面是否有任何东西


(类似于a={},但计算不正确)

您可以使用以下简单函数:

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

    return true;
}

但是如果您使用jQuery:

可以使用以下简单函数:

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

    return true;
}

但如果在ECMAScript 5中使用jQuery:

,则可以使用:

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

注意:这将只查找可枚举属性。

在ECMAScript 5中,您可以使用:

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

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

这似乎是一个无辜的问题,一个@SiteSafeNL提供的简单解决方案似乎可以工作,但存在一个未考虑的实现错误,即

如果您的目标是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;
    };
})();
现在,在@Alnitak提到的实现ECMAScript 5的现代浏览器中,您可以使用
Object.keys
,但在ES5中,现在我们有了定义不可枚举属性的能力,这些属性不会出现在
for in
循环中,如果您需要检测它们,您必须使用另一种方法,例如,使用上述功能,或
对象。键

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
如果要捕获不可枚举的自有属性,我们需要另一种方法,这就是存在
对象.getOwnPropertyNames
方法的原因:

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

这似乎是一个无辜的问题,@SiteSafeNL提供的一个简单的解决方案似乎是可行的,但有一个实现缺陷没有被考虑在内,即

如果您的目标是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;
    };
})();
现在,在@Alnitak提到的实现ECMAScript 5的现代浏览器中,您可以使用
Object.keys
,但在ES5中,现在我们有了定义不可枚举属性的能力,这些属性不会出现在
for in
循环中,如果您需要检测它们,您必须使用另一种方法,例如,使用上述功能,或
对象。键

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
如果要捕获不可枚举的自有属性,我们需要另一种方法,这就是存在
对象.getOwnPropertyNames
方法的原因:

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

这似乎对我不起作用。我发现Object和Object的语法错误是未定义的。也许您可以对此再详细说明一下?@Maxx您需要一个现代化的浏览器来获得ES5支持。如果你没有,这个函数可以被模拟-看,这似乎不适合我。我发现Object和Object的语法错误是未定义的。也许您可以对此再详细说明一下?@Maxx您需要一个现代化的浏览器来获得ES5支持。如果您没有,可以模拟此函数-请参阅完美!JS方法和我以前不熟悉的jQuery方法都非常有效。非常感谢。完美的JS方法和我以前不熟悉的jQuery方法都非常有效。非常感谢。如果你的目标是IE8及以下,请检查我的答案,接受的答案不考虑IE DontEnum错误。。。干杯如果你的目标是IE8及以下,请检查我的答案,接受的答案不考虑IE DontEnum错误。。。干杯