JavaScript 中的假值
“Falsey”只是意味着 JavaScript 的内部ToBoolean函数返回false. ToBoolean基础!value,value ? ... : ...;和if (value). 这是它的官方规范(2020 年工作草案)(自1997 年第一个 ECMAscript 规范以来,唯一的变化是添加了ES6 的 Symbols,它们始终是真实的,并且BigInt,如上所述:
| 参数类型 |
结果 |
| 不明确的 |
返回false。 |
| 空值 |
返回false。 |
| 布尔值 |
返回参数。 |
| 数字 |
如果参数是+0, -0, or NaN,则返回false;否则返回true。 |
| string |
如果参数为空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 与==或不匹配===,甚至不匹配
- 例如
NaN != NaN, NaN !== NaN, NaN != false,NaN != null
对于“严格相等”( ===),没有这样的分组。只有false === false。
这就是为什么许多开发人员和许多样式指南(例如standardjs)更喜欢===并且几乎从不使用==.
真实值实际上 == false
“真实”只是意味着 JavaScript 的内部ToBoolean函数返回true. Javascript的应用怪癖要知道的(和另一个很好的理由,更喜欢===了==):这是可能的值是truthy(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 平等表链接)
一些更真实的值
这些只是一些人可能认为是错误的一些值,但实际上是真实的。
-1 和所有非零负数
' ', " ", "false", 'null'...所有非空字符串,包括只是空格的字符串
来自 的任何内容typeof,它始终返回一个非空字符串,例如:
typeof null('object' 由于长期存在的错误/怪癖而返回一个字符串)
typeof undefined(返回一个字符串'undefined')
任何对象(document.all浏览器中的“故意违反”除外)。请记住null,尽管typeof另有建议,但这并不是真正的对象。例子:
{}
[]
function(){}或() => {}(任何函数,包括空函数)
Error 和任何实例 Error
- 任何正则表达式
- 使用
new(包括new Number(0)和new Boolean(false))创建的任何内容
任何符号
true, 1,"1"和[1]returntrue与==.