所有在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