JavaScript 中的双重比较看起来很奇怪

Double compare in JavaScript looks weird

我们var a = "first", b = "second", c = "first";.
表达式 a == c returns true, (当然!); a == c 也是 true
那为什么a == a == creturnfalse

例子

var a = "first", b = "second", c = "first";

write( a != b != c );
write( a == b != c );
write( a == b == c );
write( a != b == c );
write("");
write( a == a == c );

// -------------------
function write(val) {document.querySelector("console").innerHTML += "<hr noshade size='1px' color='#eee'>" + String(val);}
<console></console>

因为真实情况是这样的:

(a == a) == c

这真的只是:

true == "first"

参见Operator Precedence

a == c returns 布尔值 (true).

因为 a 不是布尔值,所以它不可能等于 a == c

因为它是从左到右,一次一个 == 并且之前每个 == 操作的结果都是一个布尔值:

(a == a) === true
(true == c) === false

您需要做的:

a == a && a == c

或更好(因为这是 JavaScript):

a === a && a === c

或者,可以在 CoffeeScript 中编写,这将翻译:

a == a == c

进入

(a === a && a === c);

给你。