0

例如,在 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是相同的,并且如果您所知道的只是定义对象的位模式,则无法区分它们。

4

3 回答 3

2

并非所有语言都按照您描述的方式工作。例如,在 Python==中是相等并且is是引用比较:

>>> a = [1,2,3]
>>> b = [1,2,3]
>>> a == b
True
>>> a is b
False
于 2012-05-31T03:53:19.930 回答
2

并非所有语言都这样做。C++ 使用==对象表示相等(尽管==指针表示引用相等)。我相信(尽管我不完全确定)D 编程语言保留==值相等,is运算符保留引用相等。

我认为这只是 JavaScript 和其他一些语言的设计决定。没有理由必须这样。

于 2012-05-31T03:48:50.683 回答
0

几乎每种语言都将相等作为引用相等

正如types这个问题上的标签所示,许多语言将相等性作为类型的行为来实现。这是有道理的:大多数类型都会有一些属性可以在实例上更改,而不会更改该实例的语义“值”。

所以我给出的答案是:相等并不难,由类型来定义哪些实例相等。在没有这种明确决定的情况下,任何默认值都应该是保守的。

如果您正在创建自定义类型,那么您有责任做出决定;如果语言支持继承,用它来表达你的决定“平等应该表现得像其他更基本的类型”。否则,请为该类型显式编码相等测试,就像对您认为具有正确行为的现有类型所做的那样。

于 2016-01-31T18:12:04.577 回答