243

JavaScript 中哪些值是 'falsey',这意味着它们在if(value),value ?和等表达式中评估为 false !value


Stack Overflow 上已经有一些关于错误值的目的的讨论,但没有详尽的完整答案列出所有错误值是什么。

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

4

4 回答 4

413

JavaScript 中的虚假值

“Falsey”只是意味着 JavaScript 的内部ToBoolean函数返回false. ToBoolean底层!value,value ? ... : ...;if (value). 这是它的官方规范(2020 年工作草案) (自1997 年第一个 ECMAscript 规范以来唯一的变化是添加了ES6 的 Symbols,它们总是真实的,并且BigInt,如上所述:

参数类型 结果
不明确的 返回false
无效的 返回false
布尔值 返回参数
数字 如果参数是+0,-0NaN, 返回false; 否则返回true
细绳 如果参数为空String(其长度为零),则返回false;否则返回true
大整数 如果参数是0n,返回false;否则返回true
象征 返回true
目的 返回true

==(松散相等)的比较

值得谈论虚假值与 的松散比较==,它使用ToNumber()并且可能由于潜在的差异而引起一些混淆。他们有效地形成了三个群体:

  • false, 0, -0, "", ''都相互匹配==
    • 例如false == ""'' == 0因此4/2 - 2 == 'some string'.slice(11);
  • null, undefined匹配==
    • 例如null == undefined但是undefined != false
    • 还值得一提的是,虽然typeof null返回'object'null不是一个对象,但这是一个长期存在的错误/怪癖,为了保持兼容性而没有修复。它不是一个真实的对象,并且对象是真实的(除了document.all在 HTML 中实现 Javascript 时的“故意违反”)
  • NaN 不匹配任何东西,与==or ===,甚至不匹配自身
    • 例如NaN != NaN, NaN !== NaN, NaN != false,NaN != null

对于“严格相等”(===),没有这样的分组。只有false === false.

这就是为什么许多开发人员和许多样式指南(例如standardjs)更喜欢===并且几乎从不使用==.


真实的价值观,实际上== false

“Truthy”只是意味着 JavaScript 的内部ToBoolean函数返回true. 需要注意的 Javascript 的一个怪癖(以及另一个选择===over的好理由==):一个值可能是真实的(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](感谢cloudfeet提供JavaScript Equality Table 链接

一些更真实的价值观

这些只是一些人可能认为是虚假的,但实际上是真实的价值观。

  • -1和所有非零负数

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

  • 来自 的任何内容typeof,它总是返回一个非空字符串,例如:

  • 任何对象(浏览器中的“故意违反”除外document.all)。请记住,这null并不是一个真正的对象,尽管typeof另有建议。例子:

    • {}
    • []
    • function(){}() => {}(任何函数,包括空函数)
    • Error和任何实例Error
    • 任何正则表达式
    • new用(包括new Number(0)new Boolean(false))创建的任何东西
  • 任何符号

true, 1,"1"和相互比较时[1]返回。true==

于 2013-11-07T15:34:45.237 回答
4

只是为了添加到@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

于 2017-09-20T00:10:25.063 回答
4

不要忘记"false"计算结果为的非空字符串true

于 2017-10-04T01:16:31.600 回答
1

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

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

所以有了这个,我们现在总共有 7 个“假”值(不包括上面用户提到的 document.all,因为它是 DOM 的一部分而不是 JS)。

于 2020-05-01T22:15:23.997 回答