小编典典

JavaScript 中的所有错误值

all

JavaScript 中哪些值是 ‘falsey’ ,这意味着它们在if(value),value ?和等表达式中评估为 false
!value


阅读 95

收藏
2022-05-26

共1个答案

小编典典

JavaScript 中的虚假值

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











参数类型

结果

不明确的

返回false

空值

返回false

布尔值

返回 参数

数字

如果参数是+0,-0NaN, 返回false; 否则返回true

细绳

如果参数为空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 不匹配任何东西,与==or ===,甚至不匹配自身
    • 例如NaN != NaN, NaN !== NaN, NaN != false,NaN != null

对于“严格相等”(===),没有这样的分组。只有false === false.

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


真实的价值观,实际上== false

“Truthy”只是意味着 JavaScript 的内部ToBoolean函数返回true.
需要注意的 Javascript 的一个怪癖
(以及另一个选择===over的好理由==):一个值可能是真实的(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]

一些更真实的价值观

这些只是一些人可能认为是虚假的,但实际上是真实的价值观。

  • -1和所有非零负数

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

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

    • typeof null``'object' (由于长期存在的错误/怪癖而返回一个字符串)
    • typeof undefined(返回一个字符串'undefined'
    • 任何对象(浏览器中的“故意违反”除外document.all)。请记住,这null并不是一个真正的对象,尽管typeof另有建议。例子:

    • {}

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

true, 1,"1"和相互比较时[1]返回。true``==

2022-05-26