如果我做0 ==“0”则评估为真。试试,
if( -777 == "-777" ) alert("same");
发生警报。
并且,值得注意的是,true ==“true”不会评估为true。尝试,
if( false == "false" ) alert("same");
警报不会发生。
为什么会这样?
答案 0 :(得分:32)
==的行为有点冗长,但在ecma-262 spec中明确定义:
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或两者都返回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
答案 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”。
有点烦人,真的。