15

我有一个有趣的问题,我确信很容易解释,但解释是我无法理解的。

javascript 中的未定义或空对象等于 false。

var x;
alert(!x); //returns true
alert(x==true); //returns false

一个空的数组对象呢?这相当于真还是假?

var x = [];
alert (x==true); //returns false
alert (!x); //returns false

如果它等于true,我如何检查它是否为非空?我希望做

if (!x) {
    //do stuff
}

我尝试检查x.length,但我将此对象用作地图:

var x = [];
alert(x.length); //returns 0
x.prop = "hello"; 
alert(x.length); //still returns 0

如何检查我的地图是否为空?

4

6 回答 6

14

这并不像看起来那么容易,您必须检查对象是否具有至少一个属性。

jQueryisEmptyObject为此提供了:

function isEmptyObject( obj ) {
    for ( var name in obj ) {
        return false;
    }
    return true;
}

示例用法:

> var x = [];
> x.prop = "hello"; 
> isEmptyObject(x);
false
于 2012-08-21T14:52:24.080 回答
7

有点困惑,因为您似乎在问题中混合了对象和数组。希望这可能有助于为您清除它。

一个空数组的计算结果为真:

!![] //true

但是整数 0 的计算结果为 false,所以你可以这样做:

!![].length //false

所以:

if([].length) {
   //array has 1 element at least
} else {
  //array has 0 elements
}

但是,您似乎确实使数组和对象感到困惑。在 JavaScript 中,我们有对象:

var x = {};
x.foo = "bar";
x.baz = 2;

我们有数组:

var x = [];
x.push("foo");
x.length //1

你不能做你在开瓶器中所做的事情:

var x = []; //x is an array
x.foo = "bar"; //can't do this on an array
x.length; // 0 
于 2012-08-21T14:52:38.093 回答
4

如果您使用的是 JQuery

jQuery.isEmptyObject(obj)

如果没有,你可以实现你自己的

isEmptyObject = function(obj) {
for (key in obj) {
    if (obj.hasOwnProperty(key)) return false;
}
return true;
};
于 2013-12-10T12:27:45.300 回答
3

如果您使用的是正确的 JSMap<K, V>对象,您可以简单地使用Mozilla Docs上的 Map API 。

具体来说,有一个Map.prototype.size属性和Map.prototype.entries()方法,我相信它会返回一个[]键数组。如果是这样,length 0那么地图是空的。

于 2017-07-08T20:00:38.997 回答
2

首先,您使用的是数组而不是地图。地图将是一个对象实例:

var x = {};
x.prop = "5";

您的代码是有效的,因为数组也是对象。您可以按照此问题的回答检查您的对象是否为空。

于 2012-08-21T15:12:32.800 回答
0

*如果为空列表将给出 true ( if (array1))。

*x.prop并没有真正向数组添加任何元素,它只是将值“hello”分配给数组的属性 x,但数组仍然是空的。所以你仍然应该使用.length来检查数组是否为空。

于 2015-11-26T20:16:12.533 回答