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 === NaN
IS 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 次 |
最近记录: |