JavaScript中所有假值


215

什么是JavaScript的是“falsey”的值,这意味着它们评估为假像表情if(value)value ?!value


已经有一些关于Stack Overflow上虚假值用途的讨论,但是没有详尽的完整答案列出所有虚假值是什么。

我在MDN JavaScript Reference上找不到任何完整的列表,但我惊讶地发现,在JavaScript中寻找完整的,权威的假值列表时,最重要的结果是博客文章,其中有些文章明显遗漏了(例如,NaN),并且没有一种格式像Stack Overflow那样可以添加注释或替代答案来指出古怪,惊讶,遗漏,错误或警告。因此,制作一个似乎很有意义。




5
dorey.github.io/JavaScript-Equality-Table是一个很好的资源,并且具有if()真实性选项卡。
cloudfeet

4
哇,真的很有用,谢谢![[]] == ""但是[] != []?我的头好痛...
user56reinstatemonica8'5

ECMA 262规范详细介绍了这些比较规则,特别是11.9.1至11.9.6:ecma-international.org/ecma-262/5.1/#sec-11.9.3 如果您更新答案以包括此参考文献,那将是很麻烦的。 ,因为它提供了如何(应该)进行正确/错误确定的规则。
肖恩·威尔逊

Answers:


367

JavaScript中的假值

  • false
  • 的零Number类型:0和也-00.0和六角形式0x0感谢RBT
  • BigInt类型为零:0n-0n(2020年新增,感谢GetMeARemoteJob
  • ""''``-长度的字符串0
  • null
  • undefined
  • NaN
  • document.all (仅在HTML浏览器中)
    • 这是一个奇怪的。document.all是一个假对象,带有typeofas undefined。它是IE11之前的IE中的Microsoft专有功能,并作为“故意违反JavaScript规范”而添加到HTML规范中,因此为IE编写的网站在尝试访问时不会中断document.all.something。这是虚假的,因为它if (document.all)曾经是在条件注释之前检测IE的流行方法。请参阅为什么document.all虚假?详情

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

未定义:返回false。 空:返回false。 布尔值:返回参数。 Number:如果参数为+ 0,-0或NaN,则返回false;否则,返回false。 否则返回true。 字符串:如果参数为空字符串(其长度为零),则返回false;否则,返回false。 否则返回true。 BigInt:如果参数为0n,则返回false;否则,返回false。 否则返回true。 符号:返回true。 对象:返回true。


==(宽松平等)的比较

值得一谈的是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 != NaNNaN !== NaNNaN != falseNaN != null

对于“严格相等”(===),没有这样的分组。只有false === false

这就是为什么许多开发人员和许多样式指南(例如standardjs)偏爱===并且几乎从不使用的原因之一==


真正的价值观 == false

“ Truthy”仅表示JavaScript的内部ToBoolean函数return trueJavascript的应用怪癖要知道的(和另一个很好的理由,更喜欢=====):这是可能的值是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](感谢cloudfeetJavaScript的平等表链接

一些更真实的价值

这些只是一些人可能期望是虚假的价值观,但实际上是真实的。

  • -1 和所有非零的负数
  • ' '" ""false"'null'... 所有非空字符串,包括只是空格串
  • 来自的任何内容typeof,总是返回非空字符串,例如:

  • 任何对象(document.all浏览器中的“恶意违反”除外;请记住,null尽管有typeof其他建议,但这实际上不是对象)。包含:

    • {}
    • []
    • function(){}() => {}(任何功能,包括空功能)
    • Error 以及 Error
    • 任何正则表达式
    • new(包括new Number(0)new Boolean(false))创建的任何内容
  • 任何符号

true1"1"[1]回报true相比彼此==


3
仅供参考,有什么!if?..:有一个共同点,就是他们所谓的内部ToBoolean的价值功能。如何将这些值的情况下的行为!if等已经被他们的名字暗示:他们是“falsy”的价值观。我有点害怕其他人会阅读的答案,认为“哦,所以在这种情况下(!if?...:),该值false,但是!!,它的true,但不明白的基本概念。另外两点:1)v ? true : false只是的冗长方式!!v。2)typeof 始终返回非空字符串,这是事实。
Felix Kling 2013年

1
也就是说,没有任何看待typeof nulltypeof undefined专门的意义。您可以说非空字符串是真实的。
Felix Kling 2013年

1
我知道了,但这与原始问题无关;)增加太多相关但不相关的信息可能会使读者感到困惑。
Felix Kling 2013年

5
我刚刚了解到这document.all也是虚假的
Claudiu

3
关于松散比较:由于布尔值转换为数字,因此x == false将调用ToNumber(x)与完全不同的值ToBoolean(x)。可能值得解释。我也注意到我很早以前就已经对这个答案发表评论了:D
Felix Kling

3

不要忘了非空字符串"false",其结果为true


8
…因此不是虚假的值吗?
Bergi

5
触摸。您可能期望它是虚假的,而不是虚假的,仍然值得我们注意,我认为值得在全面清单中提及
MrMcPlad

4
已添加到列表中...但是我们不要试图将其变成所有可能的真实值的综合列表!这会需要一段时间:-)
user56reinstatemonica8

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


7
JavaScript没有整数。00x00.00.00用于相同IEEE-754的64位浮点零值只是不同的文字。
fredoverflow

1

除此之外,从ES2020开始,我们还有一个虚假的新值,那就是BigInt零(0n):

0n == false // true
-0n == false // true

这样,我们现在总共有了7个“虚假”值(不包括上面用户提到的document.all,因为它是DOM而不是JS的一部分)。


1
真好!谢谢,我还没有听说过,我将它添加到大清单中,并带有链接,
感谢
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.