js 如何使a==1 && a==2 && a==3 .. 成立

本文解析了一道面试中常见的关于前端条件判断的谜题,通过深入理解==运算符的隐式转换和对象代理,演示了如何巧妙地让a==1&&a==2&&...成立。解法1利用valueOf和toString方法,解法2则借助defineProperty实现动态返回值。
摘要由CSDN通过智能技术生成

题目的由来

let a = ?;
a==1 && a==2 && a==3 成立
前端如何使a==1 && a==2 && a==3 .. 成立 
这道题目其实是多近年来多个大厂的面试题。 因为题目的诡异性让业内不禁深思  其实这道题本意是考验前端同学的基础是否夯实  
核心考点
 == 比较时会进行隐式转换
  - object隐形转时会做什么事
 == 对象代理的灵活运用

解法1(推荐)

这种方案的解决思路就是利用  == 对象比较的隐形转换  并重写valueOf方法达到目的;
如果两个值不是同一个类型的话,相应类型转换,直到两个值的类型相同再进行比较。
理解对象隐形转换做了什么事情: 
1、 首先会通过 valueOf 转换为原始值 就是获取这个对象
2、 然后 若比较的也是一个对象就直接比较内容  
3、 若比较的不是一个对象会继续toString转换为字符串比较  若对面不是字符串就把对面转换为字符串比较
/*
  首先我们测试一下他会怎么运行
*/ 
let a={
  num:0,
  valueOf(){
    console.log("valueOf")
  },
  toString(){
    console.log("toString")
  }
};
console.log(a == 1)
//执行结果
// valueOf
// false

/*
  既然运行了valueOf 我们就来看看他会返回什么值
*/ 
console.log({haha:"hahah"}.valueOf())  // { haha: 'hahah' }

/*
  我们发现返回值是本对象 但这并不影响我们在valueOf上动手脚
*/ 

let a={
  valueOf(){
    return 1
  },
};
console.log(a == 1) //true

/*
  我们既然能让他返回指定的值那么我们只要发现所需要值的规律就可以了 
*/ 

let a={
  num:0,
  valueOf(){
    //注意:this.num++的返回值
    this.num++;
    return this.num
  }
};
console.log(a==1 && a==2 && a==3 && a==4 && a==5 && a==6 && a==7 && a==8 && a==9 && a==10)


解法2

这种方法就比较直观了 直接通过对象的defineProperty方法代理对象  在get函数控制一下返回值就好了
但这可能不是面试官想要的结果
let a={num:0};

Object.defineProperty(a,"num",{
  get(){
    return 1
  }
})

console.log(a.num==1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值