由于Array.slice()不进行深度复制,因此它不适用于多维数组:
var a =[[1], [2], [3]]; var b = a.slice(); b.shift().shift(); // a is now [[], [2], [3]]
请注意,虽然我已经在shift().shift()
上面使用过,但只是b[0][0]
包含指向a[0][0]
而不是值的指针.
同样delete(b[0][0])
也会导致 a[0][0]
被删除,b[0][0]=99
并将值更改a[0][0]
为99.
当一个真值作为初始参数传递时,jQuery的extend
方法会执行深层复制:
var a =[[1], [2], [3]]; var b = $.extend(true, [], a); b.shift().shift(); // a is still [[1], [2], [3]]
谢谢诺亚.看起来我最大的问题是我将$ .extend和object作为它的第一个参数,而不是数组. (14认同)
你能解释一下b.shift().shift()的目的是什么? (2认同)
geowa4.. 29
$.extend(true, [], [['a', ['c']], 'b'])
那应该为你做.
由于Array.slice()不进行深度复制,因此它不适用于多维数组:
var a =[[1], [2], [3]]; var b = a.slice(); b.shift().shift(); // a is now [[], [2], [3]]
请注意,虽然我已经在shift().shift()
上面使用过,但只是b[0][0]
包含指向a[0][0]
而不是值的指针.
同样delete(b[0][0])
也会导致 a[0][0]
被删除,b[0][0]=99
并将值更改a[0][0]
为99.
当一个真值作为初始参数传递时,jQuery的extend
方法会执行深层复制:
var a =[[1], [2], [3]]; var b = $.extend(true, [], a); b.shift().shift(); // a is still [[1], [2], [3]]
$.extend(true, [], [['a', ['c']], 'b'])
那应该为你做.
我意识到你正在寻找一个数组的"深层"副本,但如果你只有一个单级数组,你可以使用它:
复制本机JS数组很容易.使用Array.slice()方法创建部分/全部数组的副本.
var foo = ['a','b','c','d','e']; var bar = foo.slice();
现在foo和bar是'a','b','c','d','e'的5个成员数组
当然吧是副本,而不是参考...所以如果你接下来这样做...
bar.push('f'); alert('foo:' + foo.join(', ')); alert('bar:' + bar.join(', '));
你现在会得到:
foo:a, b, c, d, e bar:a, b, c, d, e, f
JavaScript中的所有内容都是通过引用传递的,所以如果你想要一个真正的数组中对象的深层副本,我能想到的最好的方法是将整个数组序列化为JSON,然后将其反序列化.
如果你想使用纯JavaScript,那么试试这个:
var arr=["apple","ball","cat","dog"]; var narr=[]; for(var i=0;i