为什么1 == 1 == 1返回true,“1”==“1”==“1”返回true,“a”==“a”==“a”返回false?

function a() { return (1 == 1 == 1); } function b() { return ("1" == "1" == "1"); } function c() { return ("a" == "a" == "a"); } 

我在Chrome的控制台中testing了上面的代码,出于某种原因, 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"); } 

这些比较按照这些规则工作(重点是我的):

如果两个操作数的types不同,JavaScript将转换操作数,然后进行严格的比较。 如果任一操作数是一个数字或一个布尔值,操作数将尽可能转换为数字 。 否则,如果任一操作数是一个string,则string操作数将尽可能转换为数字。 如果两个操作数都是对象,那么当操作数引用内存中的同一个对象时,JavaScript比较内部引用。

那么在c发生了什么是"a"被转换为一个数字(给NaN ),结果是严格比较 true转换为一个数字(给1 )。

由于1 === NaNfalse ,所以第三个函数返回false 。 很容易看出为什么前两个函数会返回true

因为1 == true

"a" != true

所以基本上会发生什么

1 == 1"1" == "1""a" == "a"都被评估为true ,然后与下一个值进行比较。

string"1"在被比较为true之前被转换为数字( 1 ),因此也被认为等于true

现在,“为什么?!?!” 问题的解释是Javascript源于C语言家族。 其中任何数字,而不是0被认为是一个有效的true布尔值。 : – /

因为1和“1”都被转换为真,如数字。 “a”不是这种情况。 因此:

 ("1" == "1" == "1") 

评估

 (("1" == "1") == "1") 

评估为

 (true == "1") 

同样的,

 ("1" == 1 == "1") 

也是如此,或其任何组合。 实际上,转换为布尔值的任何非零数字都是正确的。

而“a”并不是真的。

这是因为JavaScript是一种弱types的语言。 这意味着它没有足够的expression能力来谈论types,而实际上却强迫价值属于它们没有语义关系的types。 因此,(1 == 1)== 1的计算结果为true,因为(1 == 1)正确计算结果为true,所以JavaScript计算结果为(true)= 1.特别是将1转换为布尔值(或者为true一个号码 – 我忘了哪个,但结果是有效的)。

关键在于JavaScript 背后的一种价值转化为另一种价值。

你的问题显示了为什么这是一个问题:('a'=='a')=='a'是错误的,因为('a'=='a')是真的,JavaScript结束比较(真)= ='a'。 由于没有明智的方法将布尔转换为字母(或将字母转换为布尔值),该语句是错误的。 当然,这违背了(==)的引用透明。

(1 == 1) == 1 。 那么这将是true == 1 ,但不是在a == a == a

布尔值作为位处理,每一位代表真或假(1代表真,0代表假)

所以1代表真,0代表假

和1 == 1 == 1会像(1 == 1)== 1,true == 1,true

而'a'=='a'=='a'将会是('a'=='a')=='a',true =='a',false

奖金:0 == 1 == 0,1 == 0 == 0和0 == 0 == 1返回true