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

时间:2014-05-09 09:50:01

标签: javascript

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。

为什么会这样?

6 个答案:

答案 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 === NaNfalse,因此第三个函数返回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