JavaScript 中的虚假值
“Falsey”只是意味着 JavaScript 的内部ToBoolean函数返回false. ToBoolean底层!value,value ? ... : ...;和if (value). 这是它的官方规范(2020 年工作草案) (自1997 年第一个 ECMAscript 规范以来唯一的变化是添加了ES6 的 Symbols,它们总是真实的,并且BigInt,如上所述:
| 参数类型 |
结果 |
| 不明确的 |
返回false。 |
| 无效的 |
返回false。 |
| 布尔值 |
返回参数。 |
| 数字 |
如果参数是+0,-0或NaN, 返回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,它总是返回一个非空字符串,例如:
typeof null'object' (由于长期存在的错误/怪癖而返回一个字符串)
typeof undefined(返回一个字符串'undefined')
任何对象(浏览器中的“故意违反”除外document.all)。请记住,这null并不是一个真正的对象,尽管typeof另有建议。例子:
{}
[]
function(){}或() => {}(任何函数,包括空函数)
Error和任何实例Error
- 任何正则表达式
new用(包括new Number(0)和new Boolean(false))创建的任何东西
任何符号
true, 1,"1"和相互比较时[1]返回。true==