你能在Javascript中重写"=="的功能吗?

7
在Python中,通过为类定义一个__eq__方法,可以覆盖==的默认行为。
那么在JavaScript中是否有类似的功能呢?如果有,应该怎样实现?
据我了解,JavaScript默认情况下(可能总是如此,如果无法覆盖它),只有在== 运算符时检查两个对象是否位于相同的地址。如何直接获取地址呢?
我之所以问这些问题,是因为我正在尝试调试某个已经离开的人编写的代码。据我所知,两个对象是相同的,但 == 返回 false 。我正在努力找出原因……我想知道是否在某处覆盖了 == (但是这是一个庞大的代码库,我不知道要搜索什么),或者对象是否被复制,因此它们存在于不同的地址,尽管据我所见它们是相同的。知道如何获取地址会有助于证实这个理论,并让我有线索去解决问题。

在JavaScript中无法覆盖运算符。如果您在两个对象上使用=====,它将仅在它们是相同引用时返回true - JLRishe
这些对象“看起来”相同,但实际上在内存中并不是同一个对象。一种双重检查的方法是向其中一个对象添加一个具有值的属性,然后查看它是否会出现在另一个对象中。如果没有,则它们是不同的对象。 - Whothehellisthat
请点击此处查看:https://dev59.com/b2kv5IYBdhLWcg3wghIi - Pacerier
2个回答

6
通常不会。JS 不允许运算符重载或者运算符作为方法使用。
某些操作符内部会调用 toString 或者 valueOf,你可以在自己的类中重写这些方法,从而影响操作的行为。

1
有趣。这适用于 == 吗? - ArtOfWarfare
@ArtOfWarfare 有时候。请参考 抽象相等比较,其中解释了如何通过强制类型转换来使用 == 进行比较不同的操作数类型配对,其中有时会使用 ToPrimitive 操作,该操作有时会调用 valueOftoString。但对于对象与对象之间的比较,== 直接进行标识比较("这些对象是否真的是同一个对象?")。 - apsillers
@ArtOfWarfare 有时候,就像apsillers所详细阐述的那样。我需要仔细查看规范并确定哪些运算符可以使用,但这在工作期间有点繁琐(抱歉)。 - ssube
@apsillers,ssube。如果两边都是对象,我认为没有办法影响== - Pacerier

1

不,JavaScript 不支持直接重写任何运算符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接