javascript 隐式类型转换

165 阅读1分钟

今天去面试遇到一个沙雕面试题。不会做,挂的很彻底

当a为多少的时候,可以输出1

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

当时看到这题的时候,我草这么简单。不久输出个1吗,这么简单

a = console.log(1)

写完,就让我回来了。 回来之后才发现,考的是隐示类型转换。 心中1万头神兽飞过。咋就不能做个人呢。

....

经过一顿百度。总结如下

隐式类型转换 常规操作

1. toString

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

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

2. valueOf

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

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

3. [Symbol.toPrimitive]

	var a = {
      i: 1,
       [Symbol.toPrimitive]() {
          return a.i++;
        }
    }

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

隐式类型转换 骚操作

1. defineProperty

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

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

2. Generator

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

3. Proxy

	var inita  =1
    var a = new Proxy(
      {},
      {
        i: 1,
        get: function() {
          return () => inita ++
        }
      }
    )

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

隐式类型转换 骚操作(骚到用别人家的方法了)

重写数组的jion

数组toString 会调用jion 生成字符串, 将jion方法重写

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