请实现一个变量可满足a==1 && a==2 && a==3 为true

当时刚看到这个题目说实话我很懵,这是怎么能实现的,但是掌握相关原理后感觉还是很神奇的

这里主要涉及的就是对象-原始值的转换相关知识点,object一般转换成原始值就是三种hint:Number,String,Default然后Default基本就是转换成Number,所以一般就划分成两类,Number和String。

然后关于对象转换,一般是先找object里面是否有Symbol.toPrimitive相关的方法,如果没有,就根据hint的类型,先后调用toString和valueOf方法,string的hint先调用toString,number和default都是先调用valueOf方法。

所以回到问题,要实现以上逻辑,很明显,==会优先将变量转换成Number,所以hint即为number,那么便有两种方法来解决该问题:

let a={
  i:1,
  [Symbol.toPrimitive](){
    return this.i++;
  }
};
console.log(a==1 && a==2 && a==3);//true
let a={
  i:1,
  valueOf(){
    return this.i++;
  }
};
console.log(a==1 && a==2 && a==3);
Last modification:July 28th, 2021 at 01:06 pm
如果觉得我的文章对你有用,请随意赞赏