2010-07-17 53 views
0

有很多关于“克隆”JavaScript对象的hubub。不过,据我所知,这是一个简单的问题:默认情况下,哪些JavaScript对象不具有深克隆?

function clone(obj) { 
    return obj; 
} 

现在我认识到DOM对象不是克隆这种方式,但据我所知它的DOM是浏览器,而不是JavaScript的一部分的一部分。

什么物体需要深度克隆,为什么?

+5

为什么问题社区wiki? – HoLyVieR 2010-07-17 01:56:13

+0

我很想看看它点击它时做了什么。它不需要。 – CoolAJ86 2010-07-18 00:00:31

回答

4

这只是返回一个参考完全相同的对象。它不是克隆什么。

x = {}, 
c=function(o){return o}, 
y = c(x), 
result = (x === y) 

结果是true

+0

我想我应该更清楚。出于某种原因,我认为它是在写入时复制的,但我想这只适用于原始值。 – CoolAJ86 2010-07-18 00:02:18

1

这是在某些方面通过/通过引用VS分配由值辩论。在大多数语言中,由于许多原因,对于任何非基本原因的参考文献,默认情况下都是默认的,可能主要包括:

1)如果每个作业都可能导致大量内存/传递给函数会创建一个深层副本。

2)额外的乐趣,当你试图改变事物的状态...没有更多this.x = 5如果this.x已经绑定。相反,如果我们是半幸运的话,可能类似this = this.clone({x: 5})

欲了解更多的背景,看看这两个环节:

http://oranlooney.com/functional-javascript/

http://oranlooney.com/deep-copy-javascript/

我认为,真正的问题可能应该是 - 为什么没有一个很好的简便方法Object提供了做深拷贝?

+0

正确执行深层复制可能会很难* - 请考虑处理循环引用,私人成员等。 – 2010-07-17 02:39:54

+1

更应该用语言来实现它的更多理由,而不是遗漏给使用它的遗留区。 ;) – 2010-07-17 02:49:13