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;
}
}
})