function a() { return (1 == 1 == 1); }
function b() { return ("1" == "1" == "1"); }
function c() { return ("a" == "a" == "a"); }
我在Chrome的控制台中测试了上述代码,但不知何故,a()
返回true,b()
返回true,c()
返回false。
为什么会这样?
function a() { return (1 == 1 == 1); }
function b() { return ("1" == "1" == "1"); }
function c() { return ("a" == "a" == "a"); }
我在Chrome的控制台中测试了上述代码,但不知何故,a()
返回true,b()
返回true,c()
返回false。
为什么会这样?
1 == 1 == 1
相当于 (1 == 1) == 1
相当于 true == 1
。function a() { return (true == 1); }
function b() { return (true == "1"); }
function c() { return (true == "a"); }
这些比较根据这些规则进行(强调是我的):
如果两个操作数的类型不相同,则 JavaScript 将操作数转换后,再应用严格比较。如果任一操作数为数字或布尔值,则在可能的情况下将操作数转换为数字;否则,如果任一操作数为字符串,则将字符串操作数转换为数字。如果两个操作数都是对象,则 JavaScript 比较内部引用,当操作数引用相同的内存中的同一对象时,它们是相等的。
所以,在 c
中发生的是,"a"
被转换为数字(得到NaN
),然后与转换为数字的 true
(得到 1
)进行严格比较。
由于 1 === NaN
是 false
,所以第三个函数返回 false
。很容易看出前两个函数为什么会返回 true
。
===
)可以避免针对字符串 "1"
发生此类意外行为。 - Konrad Gadzinafalse
。 - Jon由于 1 == true
但是 "a" != true
因此基本上发生的情况是:
1 == 1
、"1" == "1"
和 "a" == "a"
都被评估为 true
,然后与下一个值进行比较。
字符串 "1"
在与 true
比较之前被转换为数字 (1
),因此也被视为等于 true
。
现在,“为什么?!”的问题可以通过以下事实来解释:Javascript 的根源可以追溯到 C 类语言。在这些语言中,除了 0 以外的任何数字都被认为是有效的 true
布尔值。 :-/
if(x = 5)
的许多经典C语言语义错误在JS中就不存在了...但实际上它们确实存在,就像在C语言中一样。当然,它肯定没有完全继承C语言的语义,但它的行为更像C语言而不是任何Lisp语言。 - Mason Wheelerbreak;
。 - glglgl由于1和"1"都被转换为数字true,这在"a"的情况下并不成立。因此:
("1" == "1" == "1")
评估为
(("1" == "1") == "1")
(true == "1")
("1" == 1 == "1")
事实上,任何非零数字在转换为布尔值时都为真,包括正数、负数和小数。而字符串 "a" 不会被视为真。
确实,(1 == 1) == 1
是正确的。那么它将会是true == 1
,但不是在a == a == a
中。
true == "1"
计算结果为true
。 - Codortrue == 1
是正确的。换句话说,顿悟时并不是意识到类型的作用,而是意识到所有这些都是将某个东西与true
进行比较。我确信这里有重复的内容,但在我看来,这并不是你提供的那些之一。 - Jon