Javascript - 如何克隆对象?

use*_*727 19 javascript clone copy

我很迷惑.我创建一个副本myObjOne,比我删除一个条目myObjOne和JS删除我的副本(myObjTwo)中的条目呢?但为什么?

  myObjOne = {};
  myObjOne['name'] = 'xxx';
  myObjOne['id'] = 'yyy';
  myObjOne['plz'] = 'zzz';  

  // clone
  myObjTwo = myObjOne;

  // remove something
  delete myObjOne['name'];

  console.dir(myObjTwo);
Run Code Online (Sandbox Code Playgroud)

例如 http://jsbin.com/itixes/edit#javascript,html

Nar*_*ala 23

更新:删除Object.create注释中指示的克隆方法.

  myObjTwo = myObjOne;
Run Code Online (Sandbox Code Playgroud)

不克隆.它只是复制参考.

如果要克隆,可以使用JSON.parseJSON.stringify

var x = {a:{b:{c:{'d':'e'}}}};
var y = JSON.parse(JSON.stringify(x));  //y is a clone of x
console.log(y.a.b.c.d); //prints e
console.log(y === x); //prints false
Run Code Online (Sandbox Code Playgroud)

警告:正如Raynos在评论中提到的,这个基于JSON的克隆不保留输出对象中输入对象的方法.如果您的对象不包含任何方法,此解决方案就足够了.方法是作为函数的对象的属性.如果var obj = {add : function(a,b){return a+b;}}那时add是一种方法obj.

如果您需要一个支持复制方法的解决方案,那么请仔细阅读这些SO答案(如musefan,Matt和Ranhiru Cooray所指出)

我建议如何正确克隆JavaScript对象?

  • 使用 JSON 进行克隆非常昂贵并且会破坏方法。 (2认同)

Nic*_*rdu 16

您可以像这样使用jQuery:

var myObjTwo = jQuery.extend(true, {}, myObjOne);
Run Code Online (Sandbox Code Playgroud)

第一个参数表明我们想要制作一个深层副本myObjOne.