var x = { value: 0, toString () { this.value++; return this.value }, valueOf () { this.value++; return this.value } }
知识点解析:
一:== 与 === 的区别
== 允许在相等比较中进行强制类型转换,而 === 不允许。=== 比较的是值和类型,== 比较的时候,会做类型转换再比较值。
二:== 的类型转换
- ECMAScript规范中指出,a与b进行比较,如果a与b是Number,String,Boolean这三种类型中的一种,并且a与b的类型不同,那么就将a与b都转换成数字再进行比较;
- 如果a是Number,String,Boolean这三种类型中的一种,而b是一个复合对象时(Object,Array等),则对b执行ToPrimitive操作(这步是JS解释器执行的);
- ToPrimitive方法的实现,正是依次去调用对象的valueOf,toString方法,直到其中一个方法返回一个基本值,如果这两个方法没有返回基本值 ,那就认定不相等;
- valueOf 和 toString 的优先级:如果重写了两个属性,先执行重写的valueOf;如果只重写了一个属性,先执行被重写的属性;默认属性时,先执行valueOf。
三:执行方式
在 “x == 1 && x == 2 && x == 3”判断执行时,每次等式比较都会触发 valueOf、toString 方法,都会执行 value++ ,同时把最新的 value 值用于等式比较。