在Javascript中,<int-value> ==“<int-value>”的计算结果为true。为什么会这样?</int-value> </int-value>

时间:2009-03-20 03:34:30

标签: javascript variables comparison

如果我做0 ==“0”则评估为真。试试,

if( -777 == "-777" ) alert("same");
发生警报。

并且,值得注意的是,true ==“true”不会评估为true。尝试,

if( false == "false" ) alert("same");

警报不会发生。

为什么会这样?

8 个答案:

答案 0 :(得分:32)

==的行为有点冗长,但在ecma-262 spec中明确定义:

  11.9.3抽象等式比较算法

     

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

     
      
  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或两者都返回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.   

步骤16适用于您以前的例子:

   0 == "0"            // apply 16
≡  0 == toNumber("0")
≡  0 == 0              // apply 7
≡  true

步骤18,然后步骤16,适用于后者:

   true == "true"            // apply 18
≡  toNumber(true) == "true"
≡  1 == "true"               // apply 16
≡  1 == toNumber("true")
≡  1 == NaN                  // apply 6
≡  false

答案 1 :(得分:12)

这样做:

if(5 == "5")

使javascript将前5个转换为字符串。试试这个:

if(5 === "5")

===也使Javascript评估类型。

这实际上是这个question的副本,其解释非常好。

答案 2 :(得分:7)

因为Javascript是松散类型的,它会根据操作中的操作和其他变量的类型静默地转换变量。

alert ("5" - 1);  // 4  (int)
alert ("5" + 1);  // "51" (string) "+" is a string operator, too
alert ("5" == 5); // true

您可能需要查看的是身份检查(===)。这样可以确保变量相同,而不仅仅是相等

alert("5" == 5);  // true, these are equal
alert("5" === 5); // false, these are not identical.

另见这个问题:How do the equality and identity comparison operators differ? PHP的实现与javascript非常相似。

答案 3 :(得分:4)

JavaScript有两组相等运算符:

  • === and !==(严格的平等操作员)
  • == and !=(标准平等运营商)

如果两个操作数的类型相同,则标准相等运算符将进行正确的比较,但如果它们的类型不同,则可能会得到一些意外的结果,例如:

'' == '0' // false
0 == '' // true
0 == '0' // true
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n ' == 0 // true

为此我总是建议使用严格相等运算符(===,!==)。

答案 4 :(得分:1)

Javascript不会将“false”强制转换为布尔值false,仅转换为字符串“false”。

您可以将字符串值松散地转换为等效的整数,因此您的第一个示例可以正常工作。

答案 5 :(得分:1)

Javascript是一种松散类型的语言,因此只要解释器​​感觉需要,就可以在运行时完成类型转换。如果将整数与字符串进行比较,则表明它们应该是相同的类型,因此,例如,“34”== 34为真,因为整数可能在比较之前被类型化为字符串。

字符串“false”未被类型转换为bool,而bool false被强制转换为字符串,该字符串实际上具有值“0”,即包含数字0的字符串,给出“0” ==“false”,这显然是假的。

如果你想比较没有自动类型转换的值,有效地比较类型和值,使用三等于:

5 ===“5”假 “string”===“string”true

答案 6 :(得分:1)

  

为什么会这样?

因为JavaScript是松散类型的,并且非常不一致。并非所有的设计功能都经过深思熟虑;与其他编程语言相比,它的创建,实现和部署速度极快,急于将Netscape 2.0推出。直到它安定下来之后,失去了一些更令人震惊的错误并变得半标准化。

寻找隐式铸造规则之类的哲学理论可能是徒劳无功的。 JavaScript所遵循的唯一真正一致的原则是DWIM,非常消极意义。

答案 7 :(得分:0)

JavaScript将falsey值定义为0,boolean false和undefined。 “0”以外的任何字符串都为true,即使该字符串为“false”。

有点烦人,真的。