==和===的区别。如何让 x 等于 1 且让 x 等于 2 且让 x 等于 3 的等式成立?

本文探讨了JavaScript中宽松相等(==)与严格相等(===)的区别,通过实例展示了在对象x的valueOf和toString方法影响下,它们在比较过程中的行为。重点讲解了基础类型、引用类型和两者混合情况下的比较结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

宽松相等 == 和严格相等 === 都能用来判断两个值是否“相等”,
首先,我们要明确上文提到的等于指的是哪一种,我们先看下二者的区别:
(1) 对于基础类型之间的比较,== 和 === 是有区别的:

不同类型间比较,== 会将不同类型转化成同一类型后看“值”是否相等,相等则为true,
而=== 判断值和类型,如果值相等类型不同,其结果就是false

(2) 对于引用类型之间的比较,== 和 === 是没有区别的,都进行“指针地址”比较。

(3) 基础类型与引用类型之间的比较,== 和 ===是有区别的:
因为类型不同,=== 结果为 false
对于 ==,将引用类型转化为基础类型,进行“值”比较。

由此可见,上文提到的等于指的宽松相等 ==,题目变为 “x == 1 && x == 2 && x== 3”
给对象 x 设置一个属性 val并赋值为 0,并修改其 valueOf、toString 方法,
在 “x == 1 && x == 2 && x == 3”判断执行时,每次等式比较都会触发 valueOf、toString 方法,
都会执行 val++ ,同时把最新的 val 值用于等式比较,
三次等式判断时 val 值分别为 1、2、3 与等式右侧的 1、2、3 相同,从而使等式成立。

const x = {
  val: 0,
  valueOf: () => {
    x.val++
    return x.val
  },
}
const x  = {
  val: 0,
  toString: () => {
    x.val++
    return x.val
  },
}

看下运行结果,果不其然,真想给自己点个赞。
当然,让题目的等式成立的方法肯定不止这一种,留言区期待你的回复~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值