简介
一道JS面试题,有点回字的几种写法的感觉,不过挺有趣的,可以考察对JS的了解程度。要求a==1&&a==2&&a==3
结果为true。
传统方案valueOf/toString
利用==隐式类型转换的规则
如果valueOf存在,就会先找valueof,若果valueof返回的是基本类型的就会用这个值,如果是个对象就会找toString,如果toString是基本类型,就会用这个,如果是对象,就会报错,cannot convert object to primitive value
let b = 0;
let a = {
valueOf() {
return ++b;
}
};
Object.defineProperty
ES5的玩法
let b = 0;
this = Object.defineProperty(this, "a", {
get() {
return ++b;
}
});
Proxy+Symbol
ES6的新玩法,萌新落泪
let a = new Proxy({ i: 0 }, {
get: (target, name) =>{debugger; name === Symbol.toPrimitive ? () => ++target.i : target[name]},
});