JavaScript 中的所有错误值

IT技术 javascript
2021-01-27 01:19:05

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


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

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

4个回答

JavaScript 中的假值

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

“Falsey”只是意味着 JavaScript 的内部ToBoolean函数返回false. ToBoolean基础!value,value ? ... : ...;if (value). 这是它的官方规范(2020 年工作草案)(自1997 年第一个 ECMAscript 规范以来,唯一的变化是添加了ES6 的 Symbols,它们始终是真实的,并且BigInt,如上所述:

参数类型 结果
不明确的 返回false
空值 返回false
布尔值 返回参数
数字 如果参数是+0, -0, or NaN,则返回false否则返回true
string 如果参数为空String(其长度为零),则返回false否则返回true
大整数 如果参数是0n,则返回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

这就是为什么许多开发人员和许多样式指南(例如standardjs)更喜欢===并且几乎从不使用==.


真实值实际上 == false

“真实”只是意味着 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](感谢cloudfeet提供的JavaScript 平等表链接

一些更真实的值

这些只是一些人可能认为是错误的一些值,但实际上是真实的。

  • -1 和所有非零负数

  • ' ', " ", "false", 'null'...所有非空字符串,包括只是空格的字符串

  • 来自 的任何内容typeof,它始终返回一个非空字符串,例如:

  • 任何对象(document.all浏览器中的“故意违反”除外)。请记住null,尽管typeof另有建议,但这并不是真正的对象例子:

    • {}
    • []
    • function(){}() => {}(任何函数,包括空函数)
    • Error 和任何实例 Error
    • 任何正则表达式
    • 使用new(包括new Number(0)new Boolean(false)创建的任何内容
  • 任何符号

true, 1,"1"[1]returntrue==.

仅供参考,有什么!if?..:有一个共同点,就是他们所谓的内部ToBoolean的value功能。如何将这些值的情况下的行为!if等已经被他们的名字暗示:他们是“falsy”的value观。我有点害怕其他人会阅读答案并认为“哦,所以在这种情况下(!, if, ?...:),值是false,但是与!!,它是true,但不了解基本概念。另外两点:1)v ? true : false只是!!v. 2)typeof 总是返回一个非空字符串,这是真的。
2021-03-12 01:19:05
关于松散比较:因为布尔值被转换为数字,所以x == false将调用ToNumber(x)ToBoolean(x). 可能值得解释。另外我刚刚注意到我很久以前就已经评论过这个答案了:D
2021-03-28 01:19:05
我刚刚了解到这document.all也是假的
2021-03-30 01:19:05
即没有必要查看typeof nulltypeof undefined专门。你可以说非空字符串是真的。
2021-04-04 01:19:05
我明白了,但这与原始问题无关 ;) 添加太多有点相关但不相关的信息可能会让读者感到困惑。
2021-04-05 01:19:05

不要忘记"false"评估为的非空字符串true

触摸。这是一个您可能会认为是错误的值,但事实并非如此,这仍然值得了解,而且我认为,值得在综合列表中提及
2021-03-13 01:19:05
......因此不是一个虚假的value,这是要求的吗?
2021-03-20 01:19:05
添加到列表中...但我们不要试图将其变成所有可能的真实值的综合列表!那需要一段时间:-)
2021-03-21 01:19:05

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

JavaScript 没有整数。0, 0x0,0.00.00只是相同 IEEE-754 64 位浮点值零的不同文字。
2021-03-19 01:19:05

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

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

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

好的!谢谢,我还没有听说过,我已将它添加到大列表中,并附有一个链接,以表示您对提出它的回答
2021-04-07 01:19:05