【js】 使1==2==3利用对象的tostring方法

212 阅读1分钟
      const A ={
        i:1,
        toString(){
          return A.i++
        }
      }
      if(A==1&&A==2&&A==3){
        console.log("a==1==2==3");
      }else{
        console.log("a");
      }
    }

其原理是 首先,JS中类型转化只有三种情况:

  • 转换为布尔值
  • 转换为数字
  • 转换为字符串

对象在转换类型的时候,会执行原生方法ToPrimitive
其算法如下:
1.如果已经是原始类型,则返回当前值;
2.如果需要转字符串则先调用toString方法,如果此时是原始类型则直接返回,否则再调用valueOf方法并返回结果;
3.如果不是字符串,则先调用valueOf方法,如果此时是原始类型则直接返回,否则再调用toString方法并返回结果;
4.如果都没有原始类型返回,则跑出TypeError类型错误.

1.运行时会先判断 b 的类型,此时typeof a === 'object',不是原始类型,也不是字符串,因此会先执行b.valueOf()
2.b.valueOf()得到的结果是 {arr: Array(3), toString: ƒ}, 不是原始类型. 不是字符串, 因此执行b.toString()
3.由于toString()被覆盖了,因此执行覆盖后的toString(),每一次都会返回b.arr的尾元素,并更新b.arr
3.得出三次执行结果为 1, 2, 3, 实现了这个功能