如何让 a == 5 && a == 8?

347 阅读1分钟

如何让 a == 5 && a == 8

如题,如何让 a == 5 && a == 8?去解决这个问题,会让你对 JS 这个动态语言有更深入的了解。

题解一

隐式转换,利用对象的 valueOftoString 方法

var a = {
  i: 0,
  // valueOf: function () {
  //   return this.i++ * 3 + 5;
  // },
  toString: function () {
    return this.i++ * 3 + 5;
  },
}
console.log(a == 5 && a == 8);

题解二

隐式转换,利用数组的 joinshift 方法。

var a = [5, 8];
a.join = a.shift;
console.log(a == 5 && a == 8);

或者 pop 方法也可以

var a = [8, 5];
a.join = a.pop;
console.log(a == 5 && a == 8);

题解三

利用 proxy 代理

var a = new Proxy({ i: 0 }, {
  get(target) {
    return () => target.i++ * 3 + 5;
  }
});
console.log(a == 5 && a == 8);

题解四

利用 Object.defineProperty,这个方法用即使全等(===)也都可以

var a = 0;
Object.defineProperty(window, 'i', {
  get: function () {
    return a++ * 3 + 5;
  },
})
console.log(i === 5 && i === 8);