slice(0)和深拷貝有什么區別呢?
舉個栗子:
var obj = [
{
name:'melin1',
job:'111'
},
{
name:'melin2',
job:'222'
},
{
name:'melin3',
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僅僅是復制了元素的地址。
-
(1)拷貝是指得到被拷貝對象的副本,副本的修改不會影響到原對象;
-
(2)js的傳參是按值傳遞,但是對於引用類型,傳遞的值是原對象在內存中的地址,所以拷貝僅僅是獲取了原對象的引用;
-
(3)在 (2) 的基礎上,對拷貝進行修改,原對象也會被修改;
-
(4)要想避免(3)的情況出現,就不能僅僅拷貝地址,而是要將原對象的屬性樹遍歷復制到拷貝上,這樣拷貝和原對象就是完全獨立的了;
-
(5)(4)的情況叫深拷貝,與之相對, (2) 的情況叫淺拷貝;
-
(6)如果obj所有值都是非引用類型,那么obj.slice(0)與深淺拷貝沒有差別;
-
(7)如果obj有引用類型的元素的話,obj.slice(0)僅僅是復制了元素的地址,,obj.slice(0)可看作淺拷貝。
