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
==