例如,在 Javascript 中[1,2,3] === [1,2,3]
和[1,2,3] == [1,2,3]
都是假的。即使是空数组的简单情况也是错误的。原因是数组是引用类型,[1,2,3]
并且与[1,2,3]
引用不同。Javascript 在这方面并不是独一无二的,几乎每种语言都将相等作为引用相等来实现,除了最基本的类型,如整数,也许还有一些内置类型。
为什么会这样?使默认的相等运算符更强大有什么难的?那么,除了比较参考文献之外,为什么还很难比较结构特性呢?
我知道许多语言提供了使某些运算符重载以表示其他含义的工具,这样就==
可以表示您想要的含义,而不是通常的弱引用相等。我的问题不是语言是否提供了这样的功能,而是为什么默认的相等运算符不是更明智的,因此[1,2,3] == [1,2,3]
默认情况下评估为 true 并且不需要程序员干预。
在 python 中,上面的示例计算结果为 true,但是如果您定义以下类
class A:
def __init__(self, prop):
self.prop = prop
然后比较a = A(1)
然后b = A(1)
答案将是错误的,即使在结构上a
并且b
是相同的,并且如果您所知道的只是定义对象的位模式,则无法区分它们。