JavaScript中有哪些值'falsey',这意味着它们在if(value)
,value ?
和!value
等表达式中评估为false? / p>
有some discussions of the purpose of falsey values on Stack Overflow already,但没有详尽的完整答案列出所有虚假值。
I couldn't find any complete list on MDN JavaScript Reference,我惊讶地发现,在JavaScript中查找完整,权威的虚假值列表时,最重要的结果是博客文章,其中一些有明显的遗漏(例如,{{1}并且没有一个像Stack Overflow这样的格式,可以添加注释或替代答案来指出怪癖,惊喜,遗漏,错误或警告。因此,制作一个似乎是有意义的。
答案 0 :(得分:316)
false
0
以及其他形式的数字零,例如-0
,0.0
和0x0
(credit to RBT for hex form)""
,''
和``
- 长度为0的字符串null
undefined
NaN
document.all
(仅限HTML浏览器)
document.all
是一个虚假对象,typeof
为undefined
。它是IE11之前的IE中的Microsoft专有功能,并被添加到HTML spec as a "willful violation of the JavaScript specification",以便为IE编写的网站在尝试访问时不会中断,例如document.all.something
;它是假的,因为if (document.all)
曾经是一种流行的方式来检测IE,在条件评论之前。有关详细信息,请参阅Why is document.all falsy? “Falsey”仅表示JavaScript的内部ToBoolean
函数返回false
。 ToBoolean
是!value
,value ? ... : ...;
和{if (value)
的基础{1}}。这是它的official specification (2018 working draft)(自very first ECMAscript specification in 1997添加ES6's Symbols以来唯一的变化,它始终是真的):
==
(松散平等)值得讨论假值'loose comparisons with ==
,它使用ToNumber()
并且由于潜在的差异会导致一些混乱。他们实际上分为三组:
false, 0, -0, "", ''
所有人都与==
相互匹配
false == ""
,'' == 0
,因此4/2 - 2 == 'some string'.slice(11);
null, undefined
与==
匹配
null == undefined
但undefined != false
typeof null
返回'object'
,但null
为not an object, this is a longstanding bug/quirk并未修复,以保持兼容性。这不是一个真正的对象,对象是真实的(除了在HTML中实现Javascript时“故意违规”document.all
)NaN
doesn't match anything, with ==
or ===
, not even itself
NaN != NaN
,NaN !== NaN
,NaN != false
,NaN != null
“严格平等”(===
),没有这样的分组。仅false
===
false
。
这是许多开发人员和许多样式指南(例如standardjs)更喜欢===
而几乎从不使用==
的原因之一。
== false
“Truthy”只是意味着JavaScript的内部ToBoolean
函数返回true
。 要注意的Javascript怪癖(以及===
优于==
的另一个好理由):值可能是真实的(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 link)这些只是一些人可能会认为是假的,但实际上是真实的。
-1
以及所有非零负数' '
," "
,"false"
,'null'
... 所有非空字符串,包括仅为空格的字符串来自typeof
的任何内容,它总是返回非空字符串,例如:
typeof null
(返回字符串'object'
due to a longstanding bug/quirk)typeof undefined
(返回字符串'undefined'
)任何对象(浏览器中的“故意违规”document.all
除外;请记住null
实际上不是对象,尽管typeof
建议不这样做。包括:
{}
[]
function(){}
或() => {}
(任何功能,包括空功能)Error
以及Error
new
创建的任何内容(包括new Number(0)
和new Boolean(false)
)true
相互比较时, 1
,"1"
,[1]
和true
会返回==
。
答案 1 :(得分:5)
不要忘记评估为"false"
的非空字符串true
答案 2 :(得分:3)
只需添加到@ user568458的虚假值列表:
除了整数0之外,十进制数0.0,0.00或任何这样的零数也是一个假值。
var myNum = 0.0;
if(myNum){
console.log('I am a truthy value');
}
else {
console.log('I am a falsy value');
}
以上代码段打印I am a falsy value
类似地,数字0的十六进制表示也是一个虚假值,如下面的代码片段所示:
var myNum = 0x0; //hex representation of 0
if(myNum){
console.log('I am a truthy value');
}
else {
console.log('I am a falsy value');
}
以上代码段再次打印I am a falsy value
。
答案 3 :(得分:1)
除了该主题外,从ES2020开始,我们还有一个新的值,该值是错误的,它是BigInt零(0n):
0n == false // true
-0n == false // true
因此,我们现在总共有7个“虚假”值(不包括上述用户提到的document.all,因为它是DOM而不是JS的一部分)。