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。
为什么会这样?
答案 0 :(得分:185)
因为您将第一个相等的(布尔)结果与(非布尔)第三个值进行比较。
在代码中,1 == 1 == 1
相当于(1 == 1) == 1
相当于true == 1
。
这意味着这三种方法可以更简单地编写为:
function a() { return (true == 1); }
function b() { return (true == "1"); }
function c() { return (true == "a"); }
这些比较根据these rules(强调我的)来运作:
如果两个操作数的类型不同,则JavaScript会转换 操作数,然后应用严格的比较。如果任一操作数是a 如果是数字或布尔值,操作数将转换为数字 可能强>;否则,如果任一操作数是字符串,则字符串操作数为 如果可能,转换为数字。如果两个操作数都是对象,那么 JavaScript比较操作数时相同的内部引用 在内存中引用相同的对象。
c
中发生的事情是"a"
转换为数字(给出NaN
),结果是strictly compared转换为true
号码(给予1
)。
由于1 === NaN
为false
,因此第三个函数返回false
。很容易理解为什么前两个函数将返回true
。
答案 1 :(得分:26)
因为1 == true
但是"a" != true
所以基本上会发生什么
1 == 1
,"1" == "1"
和"a" == "a"
都评估为true
,然后与下一个值进行比较。
字符串"1"
在与1
进行比较之前会转换为数字(true
),因此也被视为等于true
。
现在,“为什么?!?!”问题的解释是,Javascript的根源在于C语言系列。其中0以外的任何数字都被认为是有效的true
布尔值。 : - /
答案 2 :(得分:6)
因为1和“1”都转换为true,因为数字。 “a”不是这种情况。因此:
("1" == "1" == "1")
评估为
(("1" == "1") == "1")
评估为
(true == "1")
类似地,
("1" == 1 == "1")
也是如此,或其任何组合。实际上,转换为布尔值时的任何非零数字都是真的。
然而,“a”并未评估为真。
答案 3 :(得分:5)
这是因为JavaScript是一种弱类型的语言。这意味着它不足以表达类型,并且实际上隐含地强制值属于它们没有语义关系的类型。因此,(1 == 1)== 1求值为true,因为(1 == 1)正确计算为true,因此JavaScript计算(true)= 1.特别是,它将1转换为布尔值(或者为真一个数字 - 我忘记了哪一个,但结果实际上是一样的。)
重点是JavaScript将转换一种类型的值转换为背后的另一种值。
你的问题说明了为什么这是一个问题:('a'=='a')=='a'是假的,因为('a'=='a')是真的,而JavaScript最终会比较(是)=='a'。由于只有没有明智的方法将布尔值转换为字母(或将字母转换为布尔值),因此该语句为false。当然,这会破坏(==)的引用透明度。
答案 4 :(得分:2)
(1 == 1) == 1
确实如此。然后它将是true == 1
,但不会出现在a == a == a
。
答案 5 :(得分:1)
布尔值作为位处理,每个位代表true或false(1表示true,0表示false)
因此1代表true,0代表false
和1 == 1 == 1将像(1 == 1)== 1,true == 1,true
虽然' a' ==' a' ==' a'将是(' a' ==' a')==' a',true ==' a',false
BONUS:0 == 1 == 0,1 == 0 == 0和0 == 0 == 1返回true