我有一个javascript对象,它维护一个内部对象数组。我有一个返回数组的方法,但我需要防止对数组及其中的对象进行外部操作。
尝试slice
复制数组但我注意到内部的对象仍然是引用到原始数据,而数组本身是新的。我以前从未注意到这一点,但我已经证实了这一点:
function test(){
// I want this to be safe from outside influence
var a = [{
val: 1
},{
val: 2
}];
return {
all: function(){
return a.slice();
}
}
}
var instance = test();
var copy = instance.all();
// This affects both "copy" and the original
copy[0].val = 'wrong';
// This clears "copy" but doesn't affect the original
copy = [];
http://jsfiddle.net/dczz7sL4/1/
我需要一个真正的新副本,以便局外人无法使用我设计的API方法修改数组。我假设所有我可以做的事情迭代数组并使用$.extend
(或其他库中的类似方法)单独克隆对象 - 是否有更容易/本机替代?
答案 0 :(得分:1)
深层复制的简单实现是
function clone(obj) {
return JSON.parse(JSON.stringify(obj));
}
请注意,如果您的对象中有循环引用,或者您有函数,那么这不会起作用。
您还可以使用jQuery.extend
传递true作为深层复制的第一个参数
var a =[{a:1}]
var b = $.extend(true, [], a);
b[0].a = 0;
$('#first').html(JSON.stringify(a));
$('#second').html(JSON.stringify(b));

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
First Array: <span id='first'></span> <br />
Clonde Array: <span id='second'></span>
&#13;