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