JavaScript自动类型转换混淆

时间:2011-10-29 17:30:39

标签: javascript type-conversion

鉴于此脚本:

var number = NaN;

if (!number) {
  alert("yes");
}

alert(number == false);

为什么第一个表达式`!number的计算结果为true,而第二个表达式number == false的计算结果为false?

http://jsfiddle.net/8EWG4/

4 个答案:

答案 0 :(得分:5)

看看这篇文章: http://www.smashingmagazine.com/2011/05/30/10-oddities-and-secrets-about-javascript/

有一些关于javascript的技巧,包括关于NaN的信息:

NaN是一个数字

你认为null是一个对象是荒谬的?尝试处理NaN的想法 - “不是数字” - 是一个数字!而且,NaN被认为不等于它自己!你的头疼吗?

alert(typeof NaN); //alerts 'Number'
alert(NaN === NaN); //evaluates false

事实上,NaN并不等于任何东西。确认某些东西是NaN的唯一方法是通过函数isNaN()。

答案 1 :(得分:3)

ECMAScript specification这样说:

x == y定义为(11.9.3):

  

如果x NaN ,则返回 false

!首先调用ToBoolean(9.2)(然后返回相反的内容):

  

如果参数为+ 0,-0或 NaN ,则结果为 false ;否则结果是真的

答案 2 :(得分:2)

要评估变量是NaN(不是数字),请考虑使用isNaN(number)。它会给你正确答案。

答案 3 :(得分:2)

来自维基百科 - JavaScript syntax, boolean

  

在逻辑上下文中使用时,0,-0,null,NaN,undefined和空字符串(“”)由于自动类型强制而评估为false。

!NaN == true

因此,当NaN被强制转移到false时,!NaN评估为true

但是,NaN不等于false - 它是不同的类型/值。