array(2) { ["docs"]=> array(0) { } ["count"]=> int(0) } 111string(0) "" int(1) int(10) int(70) int(8640000) string(13) "likecs_art_db" array(1) { ["query"]=> array(1) { ["match_all"]=> object(stdClass)#30 (0) { } } } array(1) { ["createtime.keyword"]=> array(1) { ["order"]=> string(4) "desc" } } int(10) int(0) int(8640000) array(2) { ["docs"]=> array(0) { } ["count"]=> int(0) } == 和 === 背后的故事 - 爱码网

     "==检查值是否相等,===检查值和类型是否相等”,这种说法并不准确。准确的来讲应该是‘==’允许强制类型转换。例如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’这个判断条件会是真值吗?由于存在强制类型转换,这个判断的结果有可能会是真,只要我们稍加处理就行。首先我们得排除一个误区,就是&&并不意味着同时,他的运算是从左到右,还是有先后顺序的。只有当&&左侧条件满足的情况下才会去执行右侧的表达式。所以只要左侧的条件满足,然后产生了副作用,就可以导致右侧的条件满足,从而使得整个表达式的结果为真值。接下来让我们看一下代码,以及运算结果。同时附上一张特殊值比较的比较表供大家了解。

== 和 === 背后的故事

== 和 === 背后的故事 

相关文章: