我正在尝试按值复制属性,以便不同的实例可以单独修改它。我的理解是,使用 jQuery 或 Zepto 的 $.extend 是“按值复制”的好方法。它不适用于我的情况,我想了解原因。我不能说我做错了什么。
var c = [ {'purple' : 1}, { 'red':2 } ]
var x = { 'name': 'my obj', 'colors': c }
var doWork = function(passX) {
var inY = $.extend({},passX);
inY.colors[0].selected = true;
return inY;
}
var y = doWork(x);
console.log( x.colors[0].selected );// true, but I think it should be undefined
console.log( y.colors[0].selected );// true
我觉得我可能错过了一些真正重要的东西。我不能从同一个对象扩展来复制吗?函数参数范围有什么令人困惑的地方吗?
jsfiddle:http: //jsfiddle.net/zfnyp/5/
编辑:正如@Niko 指出的那样,我的困惑的答案是,深层复制会生成所有子属性的按值复制版本。我认为深拷贝与浅拷贝只是意味着拷贝的深度有多少。哎呀。
再次编辑:深层复制在 Javascript 中很麻烦。JQuery 有它,但 Zepto 和 Underscore 没有。有人将其描述为无法很好地实施。为了解决我的问题,我创建了这个依赖于了解对象结构的解决方案。我相信这对我来说是正确的答案,尽管它很笨拙。
var c = [ {'purple' : 1, 'selected':false }, { 'red':2 } ]
var x = { 'name': 'my obj', 'colors': c }
var doWork = function(passX) {
var inY = $.extend({},passX);
inY.colors = $.extend([], passX.colors);
for (var i = 0; i < passX.colors.length; i++) {
inY.colors[i] = $.extend({}, passX.colors[i]);
}
inY.colors[0].selected = true;
return inY;
}
var y = doWork(x);
console.log( x.colors[0].selected );
console.log( y.colors[0].selected );