JavaScript中的假值
“ Falsey”仅表示JavaScript的内部ToBoolean
函数return false
。 ToBoolean
underlies !value
,value ? ... : ...;
和if (value)
。这是其官方规范(2020年工作草案)(自1997年第一个ECMAscript规范以来,唯一的变化是添加了ES6的Symbols,它们始终是真实的,并且BigInt
,如上所述:

与==
(宽松平等)的比较
值得一谈的是falsy值与的松散比较==
,这会使用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
“ Truthy”仅表示JavaScript的内部ToBoolean
函数return 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)
-它们是真实的对象,但是==
看到它们的值which == false
。
0 .toExponential();
-数值等于的对象 0
- 任何类似的构造都会为您提供虚假的值,并包装在真实的类型中
[]
,[[]]
和[0]
(感谢cloudfeet对JavaScript的平等表链接)
一些更真实的价值
这些只是一些人可能期望是虚假的价值观,但实际上是真实的。
true
,1
,"1"
和[1]
回报true
相比彼此==
。