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 值用于等式比较。