我正在阅读文档,我经常对语言的一些设计决策摇头。但真正让我困惑的是数组是如何处理的。
我冲到操场上试了试。你也可以试试。第一个例子:
var a = [1, 2, 3]
var b = a
a[1] = 42
a
b
这里a和b都是[1,42,3],我可以接受。数组被引用-好的!
现在来看这个例子:
var c = [1, 2, 3]
var d = c
c.append(42)
c
d
c是[1,2,3,42]但d是[1,2,3]。也就是说,d在上一个例子中看到了变化,但在这个例子中没有看到。文档上说这是因为长度变了。
现在,看看这个:
var e = [1, 2, 3]
var f = e
e[0..2] = [4, 5]
e
f
E是[4,5,3],很酷。有一个多索引替换是很好的,但是f STILL没有看到变化,即使长度没有改变。
总而言之,如果更改了一个元素,对数组的常见引用就会看到变化,但如果更改了多个元素或附加项,则会生成一个副本。
在我看来,这是一个非常糟糕的设计。我这样想对吗?有什么原因让我不明白数组为什么应该这样做吗?
编辑:数组已经改变,现在有值语义。理智多了!