JavaScript中的所有falsey值

时间:2013-11-07 15:34:45

标签: javascript

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这样的格式,可以添加注释或替代答案来指出怪癖,惊喜,遗漏,错误或警告。因此,制作一个似乎是有意义的。

4 个答案:

答案 0 :(得分:316)

JavaScript中的虚假值

  • false
  • 0以及其他形式的数字零,例如-00.00x0credit to RBT for hex form
  • ""''`` - 长度为0的字符串
  • null
  • undefined
  • NaN
  • document.all(仅限HTML浏览器)
    • 这是一个奇怪的。 document.all是一个虚假对象,typeofundefined。它是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!valuevalue ? ... : ...;和{if (value)的基础{1}}。这是它的official specification (2018 working draft)(自very first ECMAscript specification in 1997添加ES6's Symbols以来唯一的变化,它始终是真的):

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.


==(松散平等)

的比较

值得讨论假值'loose comparisons with ==,它使用ToNumber()并且由于潜在的差异会导致一些混乱。他们实际上分为三组:

  • false, 0, -0, "", '' 所有人都与==相互匹配
    • e.g。 false == ""'' == 0,因此4/2 - 2 == 'some string'.slice(11);
  • null, undefined ==匹配
    • e.g。 null == undefinedundefined != false
    • 还值得一提的是,虽然typeof null返回'object',但nullnot an object, this is a longstanding bug/quirk并未修复,以保持兼容性。这不是一个真正的对象,对象是真实的(除了在HTML中实现Javascript时“故意违规”document.all
  • NaN doesn't match anything, with == or ===, not even itself
    • e.g。 NaN != NaNNaN !== NaNNaN != falseNaN != null

“严格平等”(===),没有这样的分组。仅false === false

这是许多开发人员和许多样式指南(例如standardjs)更喜欢===而几乎从不使用==的原因之一。


实际上== false

的Truthy值

“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](感谢cloudfeetJavaScript Equality Table link

一些更真实的价值

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

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

  • 任何对象(浏览器中的“故意违规”document.all除外;请记住null实际上不是对象,尽管typeof建议不这样做。包括:

    • {}
    • []
    • function(){}() => {}(任何功能,包括空功能)
    • Error以及Error
    • 的任何实例
    • 任何正则表达式
    • 使用new创建的任何内容(包括new Number(0)new Boolean(false)
  • 任何Symbol
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的一部分)。