chr*_*ong 115 javascript
function a() { return (1 == 1 == 1); }
function b() { return ("1" == "1" == "1"); }
function c() { return ("a" == "a" == "a"); }
Run Code Online (Sandbox Code Playgroud)
我在Chrome的控制台中测试了上面的代码,由于某种原因,a()返回true,b()返回true,并c()返回false.
为什么会这样?
Jon*_*Jon 185
因为您将第一个相等的(布尔)结果与(非布尔)第三个值进行比较.
在代码中,1 == 1 == 1相当于(1 == 1) == 1相当于true == 1.
这意味着这三种方法可以更简单地编写为:
function a() { return (true == 1); }
function b() { return (true == "1"); }
function c() { return (true == "a"); }
Run Code Online (Sandbox Code Playgroud)
这些比较按照这些规则工作(强调我的):
如果两个操作数的类型不同,JavaScript会转换操作数,然后应用严格的比较.如果操作数是数字或布尔值,操作数将尽可能转换为数字 ; 否则,如果任一操作数是字符串,则尽可能将字符串操作数转换为数字.如果两个操作数都是对象,则JavaScript比较内部引用,当操作数引用内存中的同一对象时,这些内部引用相等.
所以发生的事情c是将"a"其转换为数字(给定NaN)并严格比较结果以true转换为数字(给定1).
由于1 === NaNIS false,第三函数返回false.很容易理解前两个函数返回的原因true.
Von*_*ion 26
因为 1 == true
但 "a" != true
所以基本上会发生什么
1 == 1,"1" == "1"并且"a" == "a"都被评估为true然后与下一个值进行比较.
字符串在被比较之前"1"被转换为数字(1)true,因此也被认为是等于true.
现在,"为什么?!?!" 问题的解释是,Javascript的根源在于C语言系列.其中除0之外的任何数字都被认为是有效的true布尔值.: - /
因为1和"1"都转换为true,因为数字."a"不是这种情况.因此:
("1" == "1" == "1")
Run Code Online (Sandbox Code Playgroud)
评估为
(("1" == "1") == "1")
Run Code Online (Sandbox Code Playgroud)
评估为
(true == "1")
Run Code Online (Sandbox Code Playgroud)
同样的,
("1" == 1 == "1")
Run Code Online (Sandbox Code Playgroud)
也是如此,或其任何组合.实际上,转换为布尔值时的任何非零数字都是真的.
然而,"a"并未评估为真.
这是因为JavaScript是一种弱类型的语言.这意味着它不足以表达类型,并且实际上隐含地强制值属于它们没有语义关系的类型.因此,(1 == 1)== 1求值为true,因为(1 == 1)正确计算为true,因此JavaScript计算(true)= 1.特别是,它将1转换为布尔值(或者为真一个数字 - 我忘了哪个,但结果实际上是一样的).
关键是JavaScript正在将一种类型的价值转变为背后的另一种价值.
你的问题显示了为什么这是一个问题:('a'=='a')=='a'是假的,因为('a'=='a')是真的,而JavaScript最终比较(true)= ='a'.由于没有合理的方法将布尔值转换为字母(或将字母转换为布尔值),因此该语句为false.当然,这会破坏(==)的引用透明度.
| 归档时间: |
|
| 查看次数: |
9034 次 |
| 最近记录: |