JavaScript:空数组,[]在条件结构中评估为true。为什么是这样?


94

我在代码中遇到了很多错误,因为我期望这样的表达式:

Boolean([]); 评估为假。

但是事实并非如此,因为它评估为true。

因此,可能返回的函数[]如下所示:

// Where myCollection possibly returned [ obj1, obj2, obj3] or []
if(myCollection)
{
  // ...

}else
{
  // ...
}

没有做预期的事情。

我是否以为[]空数组是错误的?

此外,此行为在所有浏览器中是否一致?还是那里也有陷阱?顺便说一下,我在Goolgle Chrome中观察到了这种行为。


5
数组是对象,对象是真实的。只是要求array.length,如果不为零,那将是事实。当您显式转换为布尔值时,该数组会首先变成一个空字符串,然后该空字符串变成false。
dandavis

1
你为什么不使用myCollection.length > 0
2013年

1
@Steve-如果myCollection碰巧是null或,将不起作用undefined。您需要使用if(myCollection && myCollection.length > 0)
Ted Hopp

@TedHopp-当然...我只是指出它myCollection.length > 0提供了一个布尔值,可以执行OP所要求的...他仍然需要从那里开始工作。
2013年

Answers:


107

http://www.sitepoint.com/javascript-truthy-falsy/

以下值始终是虚假的:

  • 0(零)
  • “”(空字符串)
  • 空值
  • 未定义
  • NaN(特殊的数字值,表示非数字!)

所有其他值均为真,包括“ 0”(引号为零),“ false”(引号为false),空函数,空数组和空对象。


25
如果测试表达式,[] == false则结果为true
m.rufca


==在您发布的链接中,有一张表格显示了使用比较器的意外情况。我评论说,在期望正确或错误的评估时要小心。
m.rufca

4
这并不能真正回答问题,这是为什么。当空字符串为假时,为什么空数组为真?作为一个故意的设计决定,这感觉很差。
Esa Lindqvist

1
也许是因为要求它们像原始对象一样工作。但是Javascript没有原始数组。
巴马尔

23

您应该检查该.length数组的,以查看它是否包含任何元素。

if (myCollection) // always true
if (myCollection.length) // always true when array has elements
if (myCollection.length === 0) // same as is_empty(myCollection)

@marczellm Steve的评论已过时,他向DevIshOne通知了“当数组包含元素时”缺少的情况,因此在编辑中已进行了纠正。
mucaho
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.