a在何时输出1

103 阅读1分钟

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

方案一:数组模式(==代表隐式转换)

let a=[1,2,3]
a.toString=a.shift;
if(a == 1&& a==2 && a==3){
console.log(1)
}

方案二:对象模式  类型的隐式转换,引用类型在比较运算的时候调用本类型的toString或者valueOf

let a={num:0}
a.valueOf=function(){
  return ++a.num
}
if(a == 1&& a==2 && a==3){
console.log(1)
}

方案三:

let a={
i:1,
valueOf(){
    return a.i++
}
if(a == 1&& a==2 && a==3){
console.log(1)
}

方案三:

let a={
i:1,
 toString(){
    return a.i++
}
if(a == 1&& a==2 && a==3){
console.log(1)
}

方案四:symbol

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

方案五: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)
}
}

方案六:

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