js魔法——如何让a==1&&a==2&&a==3为true

由 漆黑菌 于 2019年10月12日 发布

简介

一道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]},
});