如果我做0 =="0"则评估为真.尝试,
if( -777 == "-777" ) alert("same");
警报发生.
并且,值得注意的是,true =="true"不会评估为true.尝试,
if( false == "false" ) alert("same");
警报不会发生.
为什么会这样?
==的行为有点冗长,但在ecma-262规范中明确定义:
11.9.3抽象等式比较算法
比较x == y,其中x和y是值,产生真或假.这样的比较如下进行:
如果Type(x)与Type(y)不同,请转到步骤14.
如果Type(x)是Undefined,则返回true.
如果Type(x)为Null,则返回true.
如果Type(x)不是Number,请转到步骤11.
如果x是NaN,则返回false.
如果y是NaN,则返回false.
如果x与y的数值相同,则返回true.
如果x是+0且y是-0,则返回true.
如果x是-0且y是+0,则返回true.
返回false.
如果Type(x)是String,则如果x和y完全相同的字符序列(相应位置的相同长度和相同字符),则返回true.否则,返回false.
如果Type(x)是布尔值,如果x和y都为true或两者都为false,则返回true.否则,返回false.
如果x和y引用同一个对象或它们引用彼此连接的对象,则返回true(见13.1.2).否则,返回false.
如果x为null且y未定义,则返回true.
如果x未定义且y为null,则返回true.
如果Type(x)为Number且Type(y)为String,则返回比较结果x == ToNumber(y).
如果Type(x)是String并且Type(y)是Number,则返回比较结果ToNumber(x)== y.
如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y.
如果Type(y)是布尔值,则返回比较结果x == ToNumber(y).
如果Type(x)是String或Number而Type(y)是Object,则返回比较结果x == ToPrimitive(y).
如果Type(x)是Object而Type(y)是String或Number,则返回比较结果ToPrimitive(x)== y.
返回false.
第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
这样做:
if(5 == "5")
使javascript将前5个转换为字符串.试试这个:
if(5 === "5")
该===
让的Javascript评估类型为好.
这实际上是一个重复的question
地方,它解释得非常好.
因为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.
另请参阅此问题:等式和身份比较运算符如何不同?PHP的实现与javascript非常相似.