141

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

Boolean([]);评估为假。

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

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

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

}else
{
  // ...
}

没有做预期的事情。

我假设[]一个空数组是错误的吗?

此外,这种行为在所有浏览器中是否一致?或者那里也有任何陷阱?顺便说一句,我在 Google Chrome 中观察到了这种行为。

4

6 回答 6

161

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

以下值总是虚假的:

  • 错误的
  • 0(零)
  • ""(空字符串)
  • 无效的
  • 不明确的
  • NaN(一个特殊的数字值,意思是非数字!)

所有其他值都是真值,包括"0"(引号中的零)、"false"(引号中的假)、空函数、空数组 ( []) 和空对象 ( {})。

至于为什么会这样,我怀疑这是因为 JavaScript 数组只是一种特殊类型的对象。专门处理数组需要额外的开销来测试Array.isArray()。此外,如果真正的数组在这种情况下与其他类似数组的对象的行为不同,这可能会令人困惑,而使所有类似数组的对象的行为都相同会更加昂贵。

于 2013-10-02T20:27:05.543 回答
39

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

if (myCollection) // always true
if (myCollection.length) // always true when array has elements
if (myCollection.length === 0) // same as is_empty(myCollection)
于 2013-10-02T20:26:44.000 回答
11

虽然[]等于false,但它的计算结果为true

是的,这听起来很糟糕,或者至少有点令人困惑。看看这个:

const arr = [];
if (arr) console.log("[] is truethy");
if (arr == false) console.log("however, [] == false");

在实践中,如果您想检查某些内容是否为空,请检查length. (?.操作员确保也null包括在内。)

const arr = []; // or null;
if (!arr?.length) console.log("empty or null")

于 2021-01-11T08:53:55.897 回答
1

我怀疑它与离散数学和条件(如果那样)的工作方式有关。条件句有两部分,但在第一部分不存在的情况下,无论第二部分如何,它都会返回所谓的空虚事实。

这是维基百科页面中针对空洞事实的示例

“当房间里没有手机时,“房间里所有手机都关闭”的说法为真。在这种情况下,“房间里所有手机都打开”的说法也将是空洞的”

稍后,维基百科甚至特别提到了 JavaScript。

https://en.wikipedia.org/wiki/Vacuous_truth#:~:text=In%20mathematics%20and%20logic%2C%20a,%20antecedent%20cannot%20be%20satisfied.&text=One%20example%20of%20such %20a,埃菲尔%20塔%20is%20in%20玻利维亚%22。

于 2022-02-05T20:22:21.167 回答
0

就像在 JavaScript 中一样,一切都是对象,所以对于虚假和空,我使用以下条件:

if(value && Object.keys(value).length){
    // Not falsy and not empty
}
else{
    // falsy or empty array/object
}
于 2021-09-17T06:42:20.040 回答
0

还想补充一点,JavaScript 中的所有对象(数组也是对象)作为链接存储在内存中,并且这些链接始终不为空或零,这就是为什么Boolean({}) === true, Boolean([]) === true.

这也是为什么相同的对象(按值而不是链接复制)总是不相等的原因。

{} == {} // false

let a = {};
let b = a; // copying by link
b == a // true
于 2021-07-26T08:14:24.820 回答