== 和 === 背后的故事

     "==检查值是否相等,===检查值和类型是否相等”,这种说法并不准确。准确的来讲应该是‘==’允许强制类型转换。例如42 == '42',‘42’会被强制转换成42,所以最后 42 == 42的结果为true。

    基本类型和非基本类型在==比较的时候,非基本类型会被强制转换成相同的基本类型,然后再进行比较。数字和字符串比较的时候,字符串会被强制转换成数字。例如基本类型和对象在比较的时候,对象会首先调用自身的valueOf方法获取一个简单值,用作比较。如果找不到valueOf方法就会接着调用toString方法。例如1 == [1],首先[1]的valueOf会返回本身,所以强制类型转换的过程中会接着调用toString进行字符串化。我们得到的就是 1 == '1',这时‘1’会继续强制转化为1,最终1 == 1 结果为true。同理可得,1 == ['1']的结果也为true。相关的扩展还有 ‘1,3’== [1,3], '2,4' == ['2','4'],最终是字符串之间的比较,结果均为true。

    ‘a == 2 && a == 3’这个判断条件会是真值吗?由于存在强制类型转换,这个判断的结果有可能会是真,只要我们稍加处理就行。首先我们得排除一个误区,就是&&并不意味着同时,他的运算是从左到右,还是有先后顺序的。只有当&&左侧条件满足的情况下才会去执行右侧的表达式。所以只要左侧的条件满足,然后产生了副作用,就可以导致右侧的条件满足,从而使得整个表达式的结果为真值。接下来让我们看一下代码,以及运算结果。同时附上一张特殊值比较的比较表供大家了解。

 

猜你喜欢

转载自blog.csdn.net/qq_34295211/article/details/85261912