javascript运算符的不良行为

时间:2011-11-25 06:17:00

标签: javascript

我不明白为什么会这样,

console.info("") //(an empty string)

console.info(0)  //0

console.info(typeof "") //string

console.info(typeof 0) //number

console.info(""==0) //true

console.info(0=="") //true

console.info (0>="") //true

console.info ("">=0) //true

对于最后四个陈述,它不应​​该返回false。

我在FireBug中做了所有这些,这是一个firefox插件。

3 个答案:

答案 0 :(得分:4)

ECMAScript Equals Operator(==)使用抽象等式比较算法,参见ECMA-262 §11.9.3

答案 1 :(得分:2)

最后4个语句通过逻辑比较运算符涉及隐式类型转换。由于正在比较StringNumber,因此String会转换为Number""变为0,等于0

You can find it in the specification 这不是一个容易阅读的IMO

  

比较x == y,其中x和y是值,产生true或false。这样的比较如下进行:

     
      
  1. 如果Type(x)与Type(y)不同,请转到步骤14.
  2.   
  3. 如果Type(x)为Undefined,则返回true。
  4.   
  5. 如果Type(x)为Null,则返回true。
  6.   
  7. 如果Type(x)不是Number,请转到步骤11.
  8.   
  9. 如果x为NaN,则返回false。
  10.   
  11. 如果y为NaN,则返回false。
  12.   
  13. 如果x与y的数字值相同,则返回true。
  14.   
  15. 如果x为+0且y为-0,则返回true。
  16.   
  17. 如果x为-0且y为+0,则返回true。
  18.   
  19. 返回false。
  20.   
  21. 如果Type(x)是String,则如果x和y完全相同的字符序列(相应位置的长度和字符相同),则返回true。否则,返回false。
  22.   
  23. 如果Type(x)是布尔值,如果x和y都为true或两者都为false,则返回true。否则,返回false。
  24.   
  25. 如果x和y引用同一个对象或它们引用相互连接的对象,则返回true(见13.1.2)。否则,返回false。
  26.   
  27. 如果x为null且y未定义,则返回true。
  28.   
  29. 如果x未定义且y为null,则返回true。
  30.   
  31. 如果Type(x)为Number且Type(y)为String,则返回比较结果x == ToNumber(y)。
  32.   
  33. 如果Type(x)为String且Type(y)为Number,则返回比较结果ToNumber(x)== y。
  34.   
  35. 如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y。
  36.   
  37. 如果Type(y)为布尔值,则返回比较结果x == ToNumber(y)。
  38.   
  39. 如果Type(x)是String或Number而Type(y)是Object,则返回比较结果x == ToPrimitive(y)。
  40.   
  41. 如果Type(x)是Object而Type(y)是String或Number,则返回比较结果ToPrimitive(x)== y。
  42.   
  43. 返回false。
  44.   

答案 2 :(得分:1)

你已经遇到了javascripts falsey和truthy值概念。在javascript中

Truthy: Something which evaluates to TRUE.
Falsey: Something which evaluates to FALSE.

这主要是合乎逻辑的。一(1)是真实的,零(0)是假的。任何类型的对象(包括函数,数组,RegExp对象等)总是真实的。确定某些事情是否真实的最简单方法是确定它不是假的。 JavaScript中只有五个falsey值:

undefined, null, NaN, 0, "" (empty string), and false.

因此,当您最终使用Abstract Equality Comparer比较两个falsey值时,它返回true。

要解决此问题,请使用===运算符

进行类型安全比较