var obj = [
{
name:'js1',
job:'111'
},
{
name:'js2',
job:'222'
},
{
name:'js3',
job:'333'
}
];
var copy = obj.slice(0);
copy[1].name = 'tom';
console.log(obj[1].name); //tom
console.log(copy[1].name); //tom
結果是obj[1].name和copy[1].name都被修改了驹针。slice可看作淺拷貝
诀艰,因為如果obj有引用類型的元素,slice僅僅是復制了元素的地址
其垄。
- 拷貝是指得到被拷貝對象的副本,副本的修改不會影響到原對象臂外;
- js的傳參是按值傳遞喇颁,但是對于引用類型,傳遞的值是原對象在內(nèi)存中的地址橘霎,所以
拷貝僅僅是獲取了原對象的引用
;
- 在 (2) 的基礎上瓦盛,對拷貝進行修改七蜘,原對象也會被修改;
- 要想避免(3)的情況出現(xiàn)橡卤,就不能僅僅拷貝地址损搬,而是要將原對象的屬性樹遍歷復制到拷貝上柜与,這樣拷貝和原對象就是完全獨立的了嵌灰;
- (4)的情況叫深拷貝,與之相對迁匠, (2) 的情況叫淺拷貝驹溃;
- 如果obj所有值都是非引用類型,那么obj.slice(0)與深淺拷貝沒有差別豌鹤;
- 如果obj有引用類型的元素的話,obj.slice(0)僅僅是復制了元素的地址蚊惯,obj.slice(0)可看作淺拷貝