宽松相等 == 和严格相等 === 都能用来判断两个值是否“相等”,
首先,我们要明确上文提到的等于指的是哪一种,我们先看下二者的区别:
(1) 对于基础类型之间的比较,== 和 === 是有区别的:
不同类型间比较,== 会将不同类型转化成同一类型后看“值”是否相等,相等则为true,
而=== 判断值和类型,如果值相等类型不同,其结果就是false
(2) 对于引用类型之间的比较,== 和 === 是没有区别的,都进行“指针地址”比较。
(3) 基础类型与引用类型之间的比较,== 和 ===是有区别的:
因为类型不同,=== 结果为 false
对于 ==,将引用类型转化为基础类型,进行“值”比较。
由此可见,上文提到的等于指的宽松相等 ==,题目变为 “x == 1 && x == 2 && x== 3”
给对象 x 设置一个属性 val并赋值为 0,并修改其 valueOf、toString 方法,
在 “x == 1 && x == 2 && x == 3”判断执行时,每次等式比较都会触发 valueOf、toString 方法,
都会执行 val++ ,同时把最新的 val 值用于等式比较,
三次等式判断时 val 值分别为 1、2、3 与等式右侧的 1、2、3 相同,从而使等式成立。
const x = {
val: 0,
valueOf: () => {
x.val++
return x.val
},
}
const x = {
val: 0,
toString: () => {
x.val++
return x.val
},
}
看下运行结果,果不其然,真想给自己点个赞。
当然,让题目的等式成立的方法肯定不止这一种,留言区期待你的回复~