【发布时间】:2012-05-31 03:44:50
【问题描述】:
例如,在 Javascript 中,[1,2,3] === [1,2,3] 和 [1,2,3] == [1,2,3] 都是 false。即使是更简单的空数组也是错误的。原因是数组是引用类型,[1,2,3] 和 [1,2,3] 作为引用是不同的。 Javascript 在这方面并不是独一无二的,几乎每种语言都将相等作为引用相等来实现,除了最基本的类型,如整数,可能还有一些内置类型。
为什么会这样?让默认的相等运算符变得更强大有什么难的?那么,除了比较参考文献之外,为什么还很难比较结构属性呢?
我知道许多语言都提供了将某些运算符重载为其他含义的工具,因此== 将表示您想要的含义,而不是通常的弱引用相等。我的问题不是语言是否提供了这样的功能,而是为什么默认的相等运算符不是更明智的,所以 [1,2,3] == [1,2,3] 默认评估为 true 并且不需要程序员干预。
在 python 中,上面的例子计算结果为真,但如果你定义了下面的类
class A:
def __init__(self, prop):
self.prop = prop
然后将a = A(1) 与b = A(1) 进行比较,那么即使在结构上a 和b 是相同的并且如果您所知道的只是位模式,则无法区分它们。定义对象。
【问题讨论】:
-
为什么仅仅因为他们决定以他们的方式实施它就很难做到这一假设?
-
@kinakuta 因为几乎所有的语言都这样做,这表明存在某种障碍。如果这很容易,那么有人会实现一种语言,该语言可以为数组相等和更通用的类型做明显的事情。