2016-11-05 140 views
6

这可能是一个老问题,但我真的很好奇通过引用复制对象的本质作为JavaScript中的任务。硬拷贝vs浅拷贝javascript

这意味着,如果

var a = {}; 
var b = a; 
a.name = "Renato"; 
console.log(b); 
Object {name: "renato"} 

我有点新的JavaScript,这确实引起了我的注意有一个浅拷贝为对象分配的默认值。我搜索了一下,为了创建一个硬拷贝,你必须创建一个mixin。我想知道为什么这个选择作为默认,因为它的转变似乎是非常隐含的。谢谢!

+0

'想知道为什么选择这个作为默认'因为在大多数情况下,这将是最好的选择,.. Javascript是一个垃圾收集环境,它的优点之一是能够传递对象而不必担心内存泄漏。而另一个优点是速度.. – Keith

+0

此外,深度复制成本更高。默认做浅拷贝让程序员可以自由地明确地选择他们想要执行哪一个 – Alex

回答

11

对象和数组被视为对同一对象的引用。如果你想克隆这个对象,有几种方法可以做到这一点。

在以后的浏览器,你可以这样做:

var b = Object.assign({}, a); 

如果你想要去图书馆,lodash提供_.clone(和_.cloneDeep):

var b = _.clone(a); 

如果你不想做任何一种方法,你可以通过每个键和值枚举并将它们分配给一个新的对象。

通常情况下,它们在通过多个函数等时被视为引用是很有价值的。对于像数字和字符串这样的基本类型而言,情况并非如此,因为在大多数情况下,这会非常违反直觉。

+0

你也可以添加好旧的JSON.parse/stringify ..'var b = JSON.parse(JSON.stringify(a))' – Keith

+0

@Keith也是另一种想法,但这对于具有函数值的对象不起作用。 –

+0

如果我们有'{a:'b',c:function(){}}',将它串化将会导致'“''''''' –