记录实现 a == 1 && a == 2 && a == 3

164 阅读1分钟

一道题目 实现 a == 1 && a == 2 && a == 3 ?

// 实现1
const a = {
    n: 1,
    valueOf() { // 优先valueOf,toString也可,主要是a隐士类型转换
        return this.n++;
    }
}
a == 1 && a == 2 && a == 3; // true

// 实现2
function a() {}
a.toString = () => {
    // n 占个坑记录调用次数
    return a.n ? ++a.n : (a.n = 1)
}
a == 1 && a == 2 && a == 3; // true

// 使用 valueOf、toString 都是 对象类型转数据 转换成 基本类型数据
// a == 1,优先调用 valueOf(),对象默认返回当前对象,不是基本类型数据;再调用toString();

// 实现3
const a = new Proxy({}, {
    n: 1,
    get() {
      return () => this.n++;
    },
});
a == 1 && a == 2 && a == 3; // true

// 终极 Symbol.toPrimitive
// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive
// 对象在类型转换调用,优先级最高
const a = {
    ...,
    [Symbol.toPrimitive]() {
        ...
    }
}

// 变相使用数组
const a = [1,2,3]
a.join = a.shift
// 根据 规范,数组在 ToPrimitive 时,调用Array.prototype.toString(),其内部调用了 Array.prototype.join()