为什么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 === NaN
为false
,所以第三个函数返回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
- 如何将onload事件添加到div元素?
- 我不断收到“Uncaught SyntaxError:Unexpected token o”
- 使用Ajax请求将图像上载到Amazon S3,使用JavaScript和jQuery(不使用PHP)
- 链接并执行GitHub上托pipe的外部JavaScript文件
- 将JavaScriptdate格式设置为yyyy-mm-dd
- 插入数字到有序数组中的有效方法?
- RegisterStartupScript和RegisterClientScriptBlock之间的区别?
- 如何使用JavaScript HTML5canvas通过N点绘制平滑曲线?
- 如何取消选中单选button?