JavaScript 中哪些值是 ‘falsey’ ,这意味着它们在if(value),value ?和等表达式中评估为 false !value?
if(value)
value ?
!value
false
Number
0
-0
0.0
0x0
BigInt
0n
0x0n
""
''
null
undefined
NaN
document.all
typeof
document.all.something
if (document.all)
“Falsey”只是意味着 JavaScript 的内部ToBoolean函数返回false. ToBoolean底层!value,value ? ... : ...;和if (value). 这是它的 官方规范(2020 年工作草案) (自1997 年第一个 ECMAscript 规范以来唯一的变化是添加了ES6 的 Symbols,它们始终是真实的,并且BigInt,如上所述:
ToBoolean
value ? ... : ...;
if (value)
参数类型 结果 不明确的 返回false。 空值 返回false。 布尔值 返回 参数 。 数字 如果参数是+0,-0或NaN, 返回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
参数类型
结果
不明确的 返回false。 空值 返回false。 布尔值 返回 参数 。 数字 如果参数是+0,-0或NaN, 返回false; 否则返回true。 细绳 如果参数为空String(其长度为零),则返回false;否则返回true。 大整数 如果参数是0n,返回false;否则返回true。 象征 返回true。 目的 返回true。
不明确的
返回false。
空值 返回false。 布尔值 返回 参数 。 数字 如果参数是+0,-0或NaN, 返回false; 否则返回true。 细绳 如果参数为空String(其长度为零),则返回false;否则返回true。 大整数 如果参数是0n,返回false;否则返回true。 象征 返回true。 目的 返回true。
空值
布尔值 返回 参数 。 数字 如果参数是+0,-0或NaN, 返回false; 否则返回true。 细绳 如果参数为空String(其长度为零),则返回false;否则返回true。 大整数 如果参数是0n,返回false;否则返回true。 象征 返回true。 目的 返回true。
布尔值
返回 参数 。
数字 如果参数是+0,-0或NaN, 返回false; 否则返回true。 细绳 如果参数为空String(其长度为零),则返回false;否则返回true。 大整数 如果参数是0n,返回false;否则返回true。 象征 返回true。 目的 返回true。
数字
如果参数是+0,-0或NaN, 返回false; 否则返回true。
+0
true
细绳 如果参数为空String(其长度为零),则返回false;否则返回true。 大整数 如果参数是0n,返回false;否则返回true。 象征 返回true。 目的 返回true。
细绳
如果参数为空String(其长度为零),则返回false;否则返回true。
String
大整数 如果参数是0n,返回false;否则返回true。 象征 返回true。 目的 返回true。
大整数
如果参数是0n,返回false;否则返回true。
象征 返回true。 目的 返回true。
象征
返回true。
目的 返回true。
目的
==
值得谈论虚假值与 的松散比较==,它使用ToNumber()并且可能由于潜在的差异而引起一些混淆。他们有效地形成了三个群体:
ToNumber()
false, 0, -0, "", ''
false == ""
'' == 0
4/2 - 2 == 'some string'.slice(11);
null, undefined
null == undefined
undefined != false
typeof null
'object'
===
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?')是不可能发生的逻辑上的不可能性,但它会,因为:
if (value && value == false) alert('Huh?')
"0"
'0'
42 == "42"
0 == false
"0" == 0
"0" == false
new Number(0)
new Boolean(false)
0 .toExponential();
[]
[[]]
[0]
这些只是一些人可能认为是虚假的,但实际上是真实的价值观。
-1和所有非零负数
-1
' ', " ", "false", 'null'… 所有 非空字符串,包括只是空格的字符串
' '
" "
"false"
'null'
来自 的任何内容typeof,它总是返回一个非空字符串,例如:
typeof null``'object'
typeof undefined
'undefined'
任何对象(浏览器中的“故意违反”除外document.all)。请记住,这null并不是一个真正的对象,尽管typeof另有建议。例子:
{}
function(){}
() => {}
Error
new
true, 1,"1"和相互比较时[1]返回。true``==
1
"1"
[1]
true``==