All falsey values in JavaScript
JavaScript中的值是'falsey',这意味着它们在if(value),value ?和!value等表达式中的值为false?
关于Stack  Overflow上的falsey值的目的已有一些讨论,但没有详尽的完整答案列出所有的falsey值。
我在MDN JavaScript Reference上找不到任何完整列表,我很惊讶地发现在JavaScript中查找完整,权威的虚假值列表时的最佳结果是博客文章,其中一些有明显的遗漏(例如, NaN),其中没有一个像Stack  Overflow这样的格式,可以添加评论或替代答案来指出怪癖,惊喜,遗漏,错误或警告。 因此,制作一个似乎是有意义的。
-
你检查语言规范了吗?
-
@tibos blog.stackoverflow.com/2011/07/…
-
dorey.github.io/JavaScript-Equality-Table是一个很好的资源,并且有一个if()标签用于真实性。
-
哇,非常有用,谢谢! [[]] ==""但是[] != []?我的头痛...
-
ECMA 262规范详细说明了这些比较规则,特别是第11.9.1至11.9.6节:ecma-international.org/ecma-262/5.1/#sec-11.9.3如果您更新了包含此参考的答案,那么它会膨胀 因为它提供了如何(应该)进行真/假判断的规则。
-
同样,"ToBoolean"行为的ECMA-262规范也有详细记载:ecma-international.org/ecma-262/5.1/#sec-9.2
-
至少现在,在网站的不同部分有一些关于MDN的信息,而不是你搜索的内容:(在docs / Glossary / Falsy而不是docs / Web / JavaScript中)developer.mozilla.org/en-US/docs/Glossary/ Falsy
JavaScript中的虚假值
false
0和其他形式的数字零,如-0,0.0和0x0(归功于RBT表示十六进制形式)
"",''和`` - 长度为0的字符串
null
undefined
NaN
document.all(仅限HTML浏览器)
这很奇怪。 document.all是一个假对象,typeof为undefined。它是IE11之前的IE中的Microsoft专有功能,并被添加到HTML规范中作为"故意违反JavaScript规范",因此为IE编写的网站在尝试访问时不会中断,例如,document.all.something ;这是假的,因为在条件评论之前,if (document.all)曾经是一种流行的方式来检测IE。请参阅为什么document.all falsy?详情
"Falsey"只是意味着JavaScript的内部ToBoolean函数返回false。 ToBoolean是!value,value ? ... : ...;和if (value)的基础。这是它的官方规范(2018年工作草案)(自1997年第一个ECMAscript规范以来唯一的变化就是增加了ES6的符号,这些符号总是很简单):
与==比较(松散平等)
值得讨论的是虚假值与==的松散比较,后者使用ToNumber()并且由于潜在的差异而可能引起一些混淆。它们有效地形成三组:
false, 0, -0,"", ''所有人都与==相互匹配
例如false =="",'' == 0因此4/2 - 2 == 'some string'.slice(11);
null, undefined与==匹配
例如null == undefined但是undefined != false
还值得一提的是,当typeof null返回'object'时,null不是一个对象,这是一个长期存在的错误/怪癖,为了保持兼容性而没有修复。它不是一个真正的对象,对象是真实的(除了在HTML中实现Javascript时的"故意违规"document.all)
NaN与==或===不匹配,甚至不匹配
例如NaN != NaN,NaN !== NaN,NaN != false,NaN != null
"严格平等"(===),没有这样的分组。只有false === false。
这是许多开发人员和许多样式指南(例如standardjs)更喜欢===并且几乎从不使用==的原因之一。
Truthy值实际上== 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](感谢用于JavaScript Equality Table链接的cloudfeet)
一些更真实的价值观
这些只是一些人可能会认为是假的,但实际上是真实的。
-1和所有非零负数
' ',"","false",'null' ...所有非空字符串,包括只是空格的字符串
来自typeof的任何内容,它总是返回一个非空字符串,例如:
typeof null(由于长期存在的bug /怪癖,返回字符串'object')
typeof undefined(返回字符串'undefined')
任何对象(除了浏览器中的"故意违规"document.all;请记住null实际上并不是一个对象,尽管typeof建议不这样做)。包含:
{}
[]
function(){}或() => {}(任何函数,包括空函数)
Error以及Error的任何实例
任何正则表达式
使用new创建的任何内容(包括new Number(0)和new Boolean(false))
任何符号
当==,1,"1"和[1]与==相互比较时返回true。
好。
-
仅供参考,!,if和?..:的共同之处在于它们在值上调用内部ToBoolean函数。这些值在!,if等上下文中的行为方式已经在其名称中暗示:它们是"虚假"值。我有点害怕其他人会读到答案并想"哦,所以在这种情况下(!,if,?...:),值是false,但是!!,它是",但不理解潜在的概念。另外两点:1)v ? true : false只是!!v的冗长方式。 2)typeof总是返回一个非空字符串,这是真实的。
-
即特别是在查看typeof null或typeof undefined是没有意义的。你可以说非空字符串是真的。
-
我明白了,但这与原始问题无关;)添加太多有些相关但不相关的信息可能会让读者感到困惑。
-
编辑了:) ..
-
我刚刚得知document.all也是假的。
-
@Claudiu哇!谢谢,我已经编辑过了!
-
关于松散比较:因为布尔值被转换为数字,x == false将调用ToNumber(x),这与ToBoolean(x)非常不同。可能值得解释。我还注意到我很久以前就已经对这个答案发表了评论:D
-
是否有理由认为''和""是单独的值?
-
""和''是相同值的替代符号。它们应该在同一个子弹中。如果你打算这样做,你可以在undefined旁边加上void 0。
-
document.all是否应该包含在此列表中是值得怀疑的。这个问题是关于JavaScript,而不是HTML。
-
@Hans这就是为什么我说"这是一个奇怪的"并且它"被添加到HTML规范中作为'故意违反JavaScript规范'"......
-
此外,({toString:function(){return""}}) == false是真的。
不要忘记计算为true的非空字符串"false"
-
......因此,这不是一个虚假的价值吗?
-
德勤。这是一个你可能会认为是虚假的价值而??不是,这仍然是值得注意的,我认为,值得一提的是全面的清单
-
添加到列表中......但是我们不要试图把它变成一个包含所有可能的真值的综合列表!那需要一段时间:-)
只是添加到@ user568458的虚假值列表:
-
除了整数0之外,十进制数0.0,0.00或任何这样的零数也是一个假值。
1 2 3 4 5 6 7
| 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的十六进制表示也是一个假值,如下面的代码片段所示:
1 2 3 4 5 6 7
| 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。
-
JavaScript没有整数。对于相同的IEEE-754 64位浮点值零,0,0x0,0.0和0.00只是不同的文字。