关于javascript:检查空地图

Check for an empty map

我有一个有趣的问题,我确信很容易解释,但解释却让我难以理解。

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

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

空数组对象怎么样?这是真是假?

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

如果它等于真,我如何检查它是否非空?我本想这么做的

1
2
3
if (!x) {
    //do stuff
}

我试过检查x.length,但我用这个对象作为地图:

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

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


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

jquery为此提供了isEmptyObject

1
2
3
4
5
6
function isEmptyObject( obj ) {
    for ( var name in obj ) {
        return false;
    }
    return true;
}

样品用途:

1
2
3
4
> var x = [];
> x.prop ="hello";
> isEmptyObject(x);
false


有点困惑,因为您似乎在混合您的问题中的对象和数组。希望这能帮你把事情弄清楚。

空数组的计算结果为true:

1
!![] //true

但整数0的计算结果为false,因此可以执行以下操作:

1
!![].length //false

所以:

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

然而,您似乎确实使数组和对象混淆了。在javascript中,我们有对象:

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

我们有阵列:

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

你不能像开场白那样做:

1
2
3
var x = []; //x is an array
x.foo ="bar"; //can't do this on an array
x.length; // 0


如果使用jquery

1
jQuery.isEmptyObject(obj)

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

1
2
3
4
5
6
isEmptyObject = function(obj) {
for (key in obj) {
    if (obj.hasOwnProperty(key)) return false;
}
return true;
};


如果您使用的是适当的JS Map对象,那么您只需在Mozilla文档上使用map API即可。

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


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

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

您的代码是有效的,因为数组也是对象。您可以检查您的对象是否如此问题中所回答的那样为空。


*如果是空列表,则为真(if (array1))。

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