所有在JavaScript中的错误值
JavaScript中的值是'falsey' ,这意味着它们在if(value)
, value ?
等expression式中被评估为false value ?
和!value
?
已经有一些关于堆栈溢出错误值的讨论 ,但是没有详尽的完整答案列出所有错误的值。
我在MDN JavaScript Reference上找不到任何完整的列表 ,我惊奇地发现,当在JavaScript中查找完整的权威falsey值列表时,最重要的结果是博客文章,其中一些文章有明显的遗漏(例如, NaN
),没有一个像Stack Overflow这样的格式,可以添加注释或替代答案来指出怪癖,惊喜,遗漏,错误或警告。 所以,做一个似乎是有道理的。
Falsey在JavaScript中的价值
-
false
-
0
和-0
-
""
和''
-
null
-
undefined
-
NaN
-
document.all
– 这是一个奇怪的,它是一个虚假的对象,typeof
为undefined
。 这是IE11之前IE中的微软专有function,并被添加到HTML规范中作为“故意违反JavaScript规范”,以便为IE编写的网站在尝试访问时不会中断,例如document.all.something
这是虚假的,因为if (document.all)
曾经是一个stream行的方式来检测IE浏览器,有条件的评论之前。 看看为什么`document.all`虚伪? 了解详情
“Falsey”只是表示JavaScript的内部ToBoolean
函数返回false
。 ToBoolean
基础!value
, value ? ... : ...;
value ? ... : ...;
if(value){...}else{...}
。
为了与==
比较,这些形成三个组:
-
false, 0, -0, "", ''
全部用==
互相匹配- 例如
false == ""
和'' == 0
- 例如
-
null, undefined
匹配==
- 例如
null == undefined
但是undefined != false
- 另外值得一提的是,尽pipe
typeof null
返回的是'object'
,但null
不是一个对象,这是一个长期存在的bug /怪癖 ,为了保持兼容性而没有被修复。 这不是一个真正的对象,而对象是真实的(除了那个“故意违规”的document.all
,所有的Javascript都是用HTML实现的)
- 例如
-
NaN
与==
不匹配,甚至不是本身- 例如
NaN != NaN
,NaN != false
,NaN != null
- 例如
只有false
与===
匹配false
。
Truthy值其实== false
“Truthy”仅仅意味着JavaScript的内部ToBoolean
函数返回true
。 一个Javascript的怪癖要注意:值可能是truthy( ToBoolean
返回true
),而且== false
。
你可能会认为if( value && value==false ){ alert("huh?"); }
if( value && value==false ){ alert("huh?"); }
是不可能发生的逻辑不可能的事情,但是,对于:
-
"0"
和'0'
– 它们是非空的string,这是真的,但是Javascript的==
匹配等价string的数字(例如42 == "42"
)。 由于0 == false
,如果"0"==0
,"0"==false
。 -
new Number(0)
和new Boolean(false)
– 他们是对象,这是truthy,但==
看到他们的价值观,这== false
。 -
0 .toExponential();
– 数值相当于0
的对象 - 任何类似的结构,给你一个真正的价值包装在一个真正的types
-
[]
,[[]]
和[0]
(感谢JavaScript平等表链接的 cloudfeet )
一些更真实的价值
这些只是一些人可能认为是虚假的,但实际上是真的。
-
-1
和所有非零的负数 -
' '
," "
和所有非空string,即使它们只是空格 -
任何来自
typeof
东西,总是返回一个非空string,例如:-
typeof null
( 由于长期存在的bug /怪癖,返回一个string'object'
) -
typeof undefined
(返回一个string'undefined'
)
-
-
任何对象(请记住,
null
不是一个真正的对象),包括:-
{}
-
[]
-
function(){}
(任何定义为函数的variables,包括空函数) - 任何正则expression式
- 用
new
创build的任何东西(包括用new
创build的falsey值,见上)
-
true
, 1
,当用==
比较时, "1"
和[1]
返回true
。
只需添加@ user568458的falsey值列表即可:
-
除了整数0之外,十进制数字0.0,0.00或任何这样的零数字也是一个错误的值。
var myNum = 0.0; if(myNum){ console.log('I am a truthy value'); } else { console.log('I am a falsey value'); }
上面的代码片断打印
I am a falsey value
-
类似的数字0的hex表示也是一个错误的值,如下面的代码片段所示:
var myNum = 0x0; //hex representation of 0 if(myNum){ console.log('I am a truthy value'); } else { console.log('I am a falsey value'); }
上面的代码段再次打印
I am a falsey value
。
不要忘记非空string"false"
,其值为true