一道题目 实现 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()