下面代码中 a 在什么情况下会打印 1?

65 阅读1分钟

原链接:github.com/Advanced-Fr…

题目如下:

var a = ?;
if(a == 1 && a == 2 && a == 3){
 	conso.log(1);
}

1、利用toString

let a = {
  i: 1,
  toString () {
    return a.i++
  }
}

if(a == 1 && a == 2 && a == 3) {
  console.log('1');
}

2、利用valueOf

let a = {
  i: 1,
  valueOf () {
    return a.i++
  }
}

if(a == 1 && a == 2 && a == 3) {
  console.log('1');
}

3、利用数组方法

var a = [1,2,3];
a.join = a.shift;
if(a == 1 && a == 2 && a == 3) {
  console.log('1');
}

4、ES6的symbol

let a = {[Symbol.toPrimitive]: ((i) => () => ++i) (0)};
if(a == 1 && a == 2 && a == 3) {
  console.log('1');
}

5、Generator函数

let a = {
    gn: (function* () {
        yield 1;
        yield 2;
        yield 3;
    })(),
    valueOf() {
        return this.gn.next().value;
    }
};

6、使用Object.defineProperty方法

Object.defineProperty(window, 'a', {
    get: function() {
      return this.value = this.value ? (this.value += 1) : 1;
    }
});

7、Object原型上修改toString方法

Object.prototype.toString = (function () {
  var t = 1;
  return function () {
    return t++;
  }
})()
var a = {}
a == 1 && a == 2 && a == 3  // true