我很困惑。我从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);
答案 0 :(得分:23)
更新:删除Object.create
作为克隆方法,如评论中所示。
myObjTwo = myObjOne;
没有克隆。它只是复制参考。
如果您想要克隆,可以使用JSON.parse
和JSON.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
警告:正如Raynos在评论中提到的,这个基于JSON的克隆不保留输出对象中输入对象的方法。如果您的对象不包含任何方法,此解决方案就足够了。方法是作为函数的对象的属性。如果var obj = {add : function(a,b){return a+b;}}
那么add
是obj
的方法。
如果您需要一个支持复制方法的解决方案,那么请仔细阅读这些SO答案(如musefan,Matt和Ranhiru Cooray所指出的那样)
答案 1 :(得分:16)
您可以像这样使用jQuery:
var myObjTwo = jQuery.extend(true, {}, myObjOne);
第一个参数表明我们想要制作myObjOne
的深层副本。
答案 2 :(得分:3)
这不是你克隆的方式,只是将相同的原始对象存储在一个额外的变量中。也许this answer会帮助你
答案 3 :(得分:2)
关于如何不仅复制对象及其属性,而且复制其属性引用的所有对象的大量建议。这是一个克隆对象而不复制它的版本,因此克隆继承了以后添加的所有属性,除了那些被克隆自己的属性遮蔽的属性:
var cloneOf = (function() {
function F(){}
return function(o) {
F.prototype = o;
return new F();
}
}());
有些人可能会认出这种模式。一个例子:
var base = {foo:'foo', bar:'bar'};
var baseClone = cloneOf(base);
alert(baseClone.foo); // foo
答案 4 :(得分:1)
您可以使用Object.assign()
但请注意浏览器支持。
此处有更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign。
示例:
myObjTwo = Object.assign({}, myObjOne);
答案 5 :(得分:0)
您的第myObjTwo = myObjOne
行未克隆myObjOne
,它只是创建了对同一对象的重复引用!
实际答案是使用克隆函数,可能来自underscore.js等库。但实际上,看起来你有一些阅读和学习如何在Javascript中对象和指针的概念。
答案 6 :(得分:0)
简单。
var clone=function(o){
var n= {}.toString.apply(o)=="[object Array]" ? []:{};
for(i in o)
n[i]= typeof o[i]=='object' ? clone(o[i]):o[i];
return n;
};
用法:
var x={a:{d:34},b:33};
var y=clone(x); // clones 'x'
答案 7 :(得分:0)
使用ES6,使用扩展运算符。
myObjTwo = {...myObjOne}
es6中的spread运算符只是省略号。 即使原件被销毁,它也会创建原件的副本