JavaScript中的所有错误值

JavaScript中哪些值是“假的”,这意味着它们在像if(value)value ?!value这样的表达式中计算为false ?


在Stack Overflow上已经讨论了假值的用途,但没有详尽的完整答案列出所有假值是什么。

我在MDN JavaScript参考上找不到任何完整的列表,我惊讶地发现,当寻找一个完整的、权威的JavaScript错误值列表时,排名第一的结果是博客文章,其中一些有明显的遗漏(例如,NaN),而且没有一个有像Stack Overflow那样的格式,可以添加评论或替代答案来指出怪异、意外、遗漏、错误或警告。所以,做一个似乎是有意义的。

97805 次浏览

JavaScript中的Falsey值

  • false
  • Number类型的0:0-00.0,以及十六进制形式0x0 (由于RBT)
  • BigInt类型的零:0n0x0n(2020年新增,由于GetMeARemoteJob)
  • ""''`` -长度为0的字符串
  • null
  • undefined
  • NaN
  • document.all(仅在HTML浏览器中)
    • 这个很奇怪。document.all是一个伪对象,typeofundefined。在IE11之前,它是IE中的微软专有函数,并被添加到HTML规范被视为“故意违反JavaScript规范”;中,以便为IE编写的网站在试图访问时不会崩溃,例如document.all.something;它是假的,因为if (document.all)曾经是一种流行的检测IE的方法,在条件注释之前。详见为什么是文件。falsy吗?

“Falsey"简单地说,JavaScript内部的__ABC0函数返回false ToBoolean!valuevalue ? ... : ...;if (value)的基础。这里是它的官方规范(2020年工作草案)(自1997年的第一个ECMAscript规范以来唯一的变化是增加了false0,这总是真值,以及上面提到的BigInt:

参数类型 结果
未定义的 false返回。
false返回。
布尔 论点返回。
数量 如果参数为+0-0,或NaN,则返回false;否则返回true
字符串 如果参数为空String(其长度为0),则返回false;否则返回true
长整型数字 如果参数为0n,返回false;否则返回true
象征 true返回。
对象 true返回。
< / div > < /引用>

==的比较(松散相等性)

值得讨论的是假值` ==的松散比较,它使用ToNumber(),由于潜在的差异可能会引起一些混乱。他们有效地形成了三个群体:

以“严格平等”;(===),没有这样的分组。只有false === false

这就是为什么许多开发人员和许多风格指南(例如standardjs)更喜欢===而几乎从不使用==的原因之一。


true值实际上是== false

“Truthy"仅仅意味着JavaScript内部的ToBoolean函数返回true要注意Javascript的一个怪癖(和另一个更喜欢===而不是==的好理由):值可能是真值(ToBoolean返回true),但也可能是== false

你可能认为if (value && value == false) alert('Huh?')在逻辑上是不可能发生的,但它会发生,因为:

  • "0"'0' -它们是非空字符串,这是真的,但Javascript的==匹配数字与等效的字符串(例如42 == "42")。因为0 == false,如果"0" == 0"0" == false
  • new Number(0)new Boolean(false) -它们是对象,这是真值,但==看到它们的值,这是== false
  • 0 .toExponential(); -具有与0等效的数值的对象
  • 任何类似的结构,给你一个假相等的值包装在一个类型是真
  • [][[]][0](感谢cloudfeetJavaScript等式表link)

一些更真实的价值观

有些人可能认为这些价值观是错误的,但实际上是正确的。

  • -1和所有非零负数

  • ' '" ""false"'null'所有非空字符串,包括只是空白的字符串

  • typeof中的任何值,它总是返回一个非空字符串,例如:

  • 任何对象(除了“故意违反”;浏览器中的document.all)。记住,null不是一个真正的对象,尽管typeof表明不是。例子:

    • {}
    • []
    • function(){}() => {}(任何函数,包括空函数)
    • ErrorError的任何实例
    • 任意正则表达式
    • new创建的任何东西(包括new Number(0)new Boolean(false))
  • 任何象征 < p >

true1"1"[1]在与==相互比较时返回true

在@user568458的错误值列表中添加:

  • 除了整数0之外,十进制数字0.0、0.00或任何这样的零数字也是一个假值。

    var myNum = 0.0;
    if(myNum){
    console.log('I am a truthy value');
    }
    else {
    console.log('I am a falsy value');
    }
    

    上面的代码段输出I am a falsy value

  • 类似地,数字0的十六进制表示也是一个假值,如下面的代码片段所示:

    var myNum = 0x0; //hex representation of 0
    if(myNum){
    console.log('I am a truthy value');
    }
    else {
    console.log('I am a falsy value');
    }
    

    上面的代码段再次打印I am a falsy value.

不要忘记非空字符串"false",它的值为true

除了主题之外,从ES2020开始,我们有了一个假的新值,它是BigInt 0 (0n):

0n == false // true
-0n == false // true
0n === false // false
-0n === false // false

这样一来,我们就有了7个“假”字;总价值(不包括文件)。如上所述,因为它是DOM的一部分,而不是JS)。