if(a==1&&a==2&&a==3),a的值什么情况下等于true

隐式转换规则

JavaScript中,当涉及到加运算或==判断时,会触发隐式转换规则,转换的目的是将两个值转换为相同的数据类型:

  1. 两个引用类型比较,只需判断它们是不是引用了同一个对象,是返回true,否则为false
  2. undefined 和 null 两者互相比较或者与自身比较,结果是true。它俩与其他任何值比较的都为false
  3. NaN与任何值比较包括它自身结果都是false
  4. String,Number,Boolean中的任意两个进行比较,最后都会转为Number类型再进行比较
  5. 引用类型和基本数据类型进行比较,两者最后都会转换成基本数据类型再进行比较

实例

//	const a = ???
const a = {
  i: 1,
  valueOf: function () {
    return this.i++
  }
}

if(a == 1 && a == 2 && a == 3){
  console.log("满足条件")
}


// 扩展
const b = {
  i: 0,
  list: [1, 2, 'lalala'],
  valueOf: function () {
    return this.list[this.i++]
  }
}

if(b == 1 && b == 2 && b == 'lalala'){
  console.log("满足条件")
}

原理解读

a 是一个对象,JavaScript中,当复杂类型和基本数据类型做比较时,会先调用复杂类型的valueOf方法,获取类型的原始值,如果得到的是一个string类型则直接返回原始值,如果得到的不是一个string类型,则继续调用toString方法,得到string类型之后返回。

使用重写对象的toString方法也可以:

//	const a = ???
const a = {
  i: 1,
  toString: function () {
    return this.i++
  }
}

if(a == 1 && a == 2 && a == 3){
  console.log("满足条件")
}

使用Object.defineProperty

通过劫持window对象,每次读取a属性时,都给 _a 增加1

let _a = 1
Object.defineProperty(window, 'a', {
  get() {
    return _a++
  }
})

if (a == 1 && a == 2 && a == 3) {
  console.log("满足条件")
}

使用Proxy

还有另一种劫持数据的方式,Vue3也是将响应式原理中的数据劫持Object.defineProperty换成了Proxy

let a = new Proxy({ i: 1 }, {
  get(target) {
    return () => target.i++
  }
})

if (a == 1 && a == 2 && a == 3) {
  console.log("满足条件")
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_孤傲_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值