为什么空 JavaScript 数组在条件结构中评估为真?

IT技术 javascript arrays object conditional-statements
2021-02-06 13:15:15

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

Boolean([]); 评估为假。

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

因此,可能[]像这样返回的函数

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

}else
{
  // ...
}

没有做预期的事情。

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

另外,这种行为在所有浏览器中是否一致?或者那里也有什么问题?顺便说一下,我在 Google Chrome 中观察到了这种行为。

5个回答

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

以下值始终为假:

  • 错误的
  • 0(零)
  • ""(空字符串)
  • 空值
  • 不明确的
  • NaN(一个特殊的数值,表示非数值!)

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

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

2021-03-16 13:15:15
这并没有真正回答问题,这就是为什么。当空字符串为假时,为什么空数组为真?作为一个深思熟虑的设计决定,这感觉很糟糕。
2021-03-19 13:15:15
如果您测试表达式,[] == false它的计算结果为true
2021-04-02 13:15:15
==在您发布的链接中,有一些表格显示了使用比较器的意外情况我评论只是为了在期待真假评估时要小心。
2021-04-03 13:15:15
也许,因为它们需要像原始对象一样起作用。但是 Javascript 没有原始数组。
2021-04-09 13:15:15

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

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

[]等于 时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")

为什么我现在才知道可选链操作符?以及相关的Nullish 合并运算符太好了!谢谢
2021-03-18 13:15:15
哇,那个可选的链接操作符 ?.这看起来很新(而且很有用)。感谢我的 TIL。
2021-03-25 13:15:15
@КонстантинВан 我想它需要一个关于兼容性的警告。:-) 谢谢你指出这一点。
2021-03-31 13:15:15

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

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

{} == {} // false

let a = {};
let b = a; // copying by link
b == a // true

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

if(value && Object.keys(value).length){
    // Not falsy and not empty
}
else{
    // falsy or empty array/object
}