硬拷贝与浅拷贝javascript

Ren*_*cia 11 javascript

这可能是一个老问题,但我真的很好奇通过引用复制对象的性质作为javascript中的赋值.

意思是如果

var a = {}; 
var b = a;
a.name = "Renato";
console.log(b); 
Object {name: "renato"}
Run Code Online (Sandbox Code Playgroud)

我是javascript的新手,这引起了我的注意,有一个浅拷贝作为对象赋值的默认值.我搜索了一下,为了创建一个硬拷贝,你必须创建一个mixin.我想知道为什么这被选为默认值,因为它的转换似乎非常隐含.谢谢!

Jos*_*eam 22

对象和数组被视为对同一对象的引用.如果要克隆对象,有几种方法可以执行此操作.

在以后的浏览器中,您可以:

var b = Object.assign({}, a);
Run Code Online (Sandbox Code Playgroud)

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

var b = _.clone(a);
Run Code Online (Sandbox Code Playgroud)

如果您不想执行这些方法中的任何一个,则只需枚举每个键和值,并将它们分配给新对象.

通常,在通过多个函数等时将它们视为引用是有价值的.对于像数字和字符串这样的原语来说不是这种情况,因为在大多数情况下这会感觉非常违反直觉.

  • 您还可以添加旧的 JSON.parse/stringify.. `var b = JSON.parse(JSON.stringify(a))` (3认同)
  • 事实上,我应该提到数据是否可序列化。它只是作为另一种选择,如果在较旧的浏览器上运行,您可以执行此操作,而不必说加载 lodash/下划线等。 (2认同)
  • 如果使用ES6编写,则还可以使用对象散布运算符:`let b = {... a};`。看起来(许多)浏览器还不支持此功能,因此,只有在使用编译器(如babel)并且以ES5或更早版本为目标时,才应该这样做。 (2认同)