JavaScript中所有假值

2020/10/14 01:21 · javascript ·  · 0评论

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


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

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

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相比彼此==

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

只是要添加到@ 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

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

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

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

本文地址:http://javascript.askforanswer.com/javascriptzhongsuoyoujiazhi.html
文章标签:
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!