1、利用隐式类型转换
==操作符在左右数据类型不一致时,会先进行隐式转换。
a == 1 && a == 2 && a == 3 的值意味着其不可能是基本数据类型。因为如果a是null或者是undefined boolean类型,都不可能返回true。
因此可以推测a是复杂数据类型,JS中复杂数据类型只有object。
const a = {
value:[3,2,1],
valueOf: function () {return this.value.pop(); },
}
从引用类型到基本类型的转换,也就是拆箱的过程中,会遵循ECMAScript规范规定的toPrimitive原则,一般会调用引用类型的valueOf和toString方法,你也可以直接重写toPeimitive方法。一般转换成不同类型的值遵循的原则不同,例如:
- 引用类型转换为Number类型,先调用valueOf,再调用toString
- 引用类型转换为String类型,先调用toString,再调用valueOf
了解更多请移步js隐式类型转换。
2、利用数据劫持(Proxy/Object.defineProperty)
let a = new Proxy({},{
i:1,
get:function(){
return ()=>this.i++;
}
})
3、数组的toString接口默认调用数组的join方法,重写join方法
let a = [1,2,3];
a.join = a.shift;