JavaScript中的所有falsey值

All falsey values in JavaScript

JavaScript中的值是'falsey',这意味着它们在if(value)value ?!value等表达式中的值为false?

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

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


JavaScript中的虚假值

  • false
  • 0和其他形式的数字零,如-00.00x0(归功于RBT表示十六进制形式)
  • ""''`` - 长度为0的字符串
  • null
  • undefined
  • NaN
  • document.all(仅限HTML浏览器)

  • 这很奇怪。 document.all是一个假对象,typeofundefined。它是IE11之前的IE中的Microsoft专有功能,并被添加到HTML规范中作为"故意违反JavaScript规范",因此为IE编写的网站在尝试访问时不会中断,例如,document.all.something ;这是假的,因为在条件评论之前,if (document.all)曾经是一种流行的方式来检测IE。请参阅为什么document.all falsy?详情
  • "Falsey"只是意味着JavaScript的内部ToBoolean函数返回falseToBoolean!valuevalue ? ... : ...;if (value)的基础。这是它的官方规范(2018年工作草案)(自1997年第一个ECMAscript规范以来唯一的变化就是增加了ES6的符号,这些符号总是很简单):

    Undefined: Return false. Null: Return false. Boolean: Return argument. Number: If argument is +0, -0, or NaN, return false; otherwise return true. String: If argument is the empty String (its length is zero), return false; otherwise return true. Symbol: Return true. Object: Return true.

    ==比较(松散平等)

    值得讨论的是虚假值与==的松散比较,后者使用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 != NaNNaN !== NaNNaN != falseNaN != 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

    好。


    不要忘记计算为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