JavaScript中的所有falsey值

use*_*ca8 193 javascript

JavaScript中的值是什么'falsey',这意味着它们在表达式中评估为false if(value),value ?并且!value


关于Stack Overflow上的falsey值的目的已有一些讨论,但没有详尽的完整答案列出所有的falsey值.

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

use*_*ca8 337

JavaScript中的虚假值

"Falsey"只是意味着JavaScript的内部ToBoolean函数返回false. ToBoolean基础!value,value ? ... : ...;if (value).这是它的官方规范(2018年工作草案)(自1997年第一个ECMAscript规范以来唯一的变化就是增加了ES6的符号,这些符号总是很简单):

未定义:返回false. Null:返回false. Boolean:返回参数. Number:如果参数为+ 0,-0或NaN,则返回false;  否则返回true. String:如果参数是空String(其长度为零),则返回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.

这是许多开发人员和许多样式指南(例如标准 js)更喜欢===并且几乎从不使用的原因之一==.


实际上Truthy的价值观 == false

"Truthy"只是意味着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](感谢用于JavaScript Equality Table链接的cloudfeet)

一些更真实的价值观

这些只是一些人可能会认为是假的,但实际上是真实的.

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

  • 任何对象(除了document.all浏览器中的"故意违规" ; 除非另有说明,否则请记住这null不是真正的对象typeof).包含:

    • {}
    • []
    • function(){}() => {}(任何功能,包括空功能)
    • Error 和任何实例 Error
    • 任何正则表达式
    • new(包括new Number(0)new Boolean(false))创建的任何东西
  • 任何符号

true,1,"1"[1]返回true相互比较与时==.

  • 我刚刚了解到[`document.all`是假的](http://stackoverflow.com/a/35642837/15055). (5认同)
  • 仅供参考,```,`if`和`?..:`的共同点是它们在值上调用内部`ToBoolean`函数.这些值如何在`!`,`if`等的上下文中表现如下:它们的名称已暗示:它们是"虚假"值.我有点担心其他人会读到答案并且认为*"哦,所以在这种情况下(```,`if`,`?...:`),值是'false`,但是带有`! !`,这是'真实'"*,但不理解基本概念.另外两点:1)`v?true:false`只是`!! v`的冗长方式.2)`typeof`*always*返回一个非空字符串,这是真实的. (3认同)
  • 关于松散比较:因为布尔值转换为数字,`x == false`将调用`ToNumber(x)`,这与`ToBoolean(x)`非常不同.可能值得解释.我还注意到我很久以前就已经对这个答案发表了评论:D (3认同)