如何让 (a == 1 && a == 2 && a == 3) 的值为 true

Object 转换为原始类型

  • 如果部署了 [Symbol.toPrimitive] 接口,那么调用此接口,若返回的不是基本数据类型,抛出错误。

  • 如果没有部署 [Symbol.toPrimitive] 接口,那么根据要转换的类型,先调用 valueOf / toString

    • 非Date类型对象,hintdefault 时,调用顺序为:valueOf >>> toString,即 valueOf 返回的不是基本数据类型,才会继续调用 valueOf,如果 toString 返回的还不是基本数据类型,那么抛出错误。

    • 如果 hintstring(Date对象的 hint 默认是 string) ,调用顺序为:toString >>> valueOf,即 toString 返回的不是基本数据类型,才会继续调用 valueOf,如果 valueOf 返回的还不是基本数据类型,那么抛出错误。

    • 如果 hintnumber,调用顺序为: valueOf >>> toString

题解

  1. 隐式转换

// 部署 [Symbol.toPrimitive] / valueOf / toString 均可
let a = {
    [Symbol.toPrimitive]: (function(hint) {
        let i = 1;
        return function() {
            return i++;
        }
    })()
}
  1. 数据劫持

let a = new Proxy({}, {
    i: 1,
    get: function() {
        return () => this.i++;
    }
})
  1. 数组的 toString 接口默认调用数组的 join 方法,重写 join 方法

let a = [1, 2, 3];
a.join = a.shift;

Last updated