所有在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 – 这是一个奇怪的,它是一个虚假的对象, typeofundefined 。 这是IE11之前IE中的微软专有function,并被添加到HTML规范中作为“故意违反JavaScript规范”,以便为IE编写的网站在尝试访问时不会中断,例如document.all.something 这是虚假的,因为if (document.all)曾经是一个stream行的方式来检测IE浏览器,有条件的评论之前。 看看为什么`document.all`虚伪? 了解详情

“Falsey”只是表示JavaScript的内部ToBoolean函数返回false ToBoolean基础!valuevalue ? ... : ...; value ? ... : ...; if(value){...}else{...}

为了与==比较,这些形成三个组:

  • false, 0, -0, "", ''全部用==互相匹配
    • 例如false == ""'' == 0
  • null, undefined匹配==
    • 例如null == undefined但是undefined != false
    • 另外值得一提的是,尽pipetypeof null返回的是'object' ,但null 不是一个对象,这是一个长期存在的bug /怪癖 ,为了保持兼容性而没有被修复。 这不是一个真正的对象,而对象是真实的(除了那个“故意违规”的document.all ,所有的Javascript都是用HTML实现的)
  • NaN==不匹配,甚至不是本身
    • 例如NaN != NaNNaN != falseNaN != 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值,见上)

true1 ,当用==比较时, "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