如何區分深拷貝與淺拷貝,簡單點來說,就是假設b複製了a,當修改a時,看b是否會發生變化,如果b也跟著變了,說明這是淺拷貝,拿人手短,如果b沒變,那就是深拷貝,自食其力
我們希望在改變新的陣列(物件)的時候,不改變原陣列(物件)
我們在使用深拷貝的時候,一定要弄清楚我們對深拷貝的要求程度:是僅「深」拷貝第一層級的物件屬性或陣列元素,還是遞迴拷貝所有層級的物件屬性和陣列元素?
改變任意乙個新物件/陣列中的屬性/元素, 都不改變原物件/陣列
1.直接遍歷
var array = [1, 2, 3, 4];
function copy (array)
return newarray;
}var copyarray = copy(array);
copyarray[0] = 100;
console.log(array); // [1, 2, 3, 4]
console.log(copyarray); // [100, 2, 3, 4]
2. slice()和concat()
1.直接遍歷
var obj =
function copy (obj) ;
for (let item in obj )
return newobj;}
var copyobj = copy(obj);
copyobj.name = '我才不是彭湖灣呢! 哼 (。・`ω´・)';
console.log(obj); //
console.log(copyobj); //
2.es6的object.assign
var obj =
var copyobj = object.assign({}, obj);
copyobj.name = '我才不叫彭湖灣呢! 哼 (。・`ω´・)';
console.log(obj); //
console.log(copyobj); //
object.assign:用於物件的合併,將源物件(source)的所有可列舉屬性,複製到目標物件(target),並返回合併後的target
3.es6擴充套件運算子:
var obj =
var copyobj =
copyobj.name = '我才不叫彭湖灣呢! 哼 (。・`ω´・)'
console.log(obj.name) // 彭湖灣
console.log(copyobj.name) // 我才不叫彭湖灣呢! 哼 (。・`ω´・)
擴充套件運算子(...)用於取出引數物件的所有可遍歷屬性,拷貝到當前物件之中
4.jquery淺拷貝var copiedobject = jquery.extend({}, originalobject)
如果改變了originalobject,copiedobject 也會變。
對多層巢狀物件,很遺憾,上面四種方法,都會失敗:
1.不僅拷貝第一層級,還能夠拷貝陣列或物件所有層級的各項值
2. 不是單獨針對陣列或物件,而是能夠通用於陣列,物件和其他複雜的json形式的物件
1.json.parse(json.stringify(obj))
當obj為物件時,這個方法會省略那些值為 functions 和 undefined 的屬性,值為null還返回null
當obj為陣列時,如果陣列裡有function 、undefined、null,序列化後都變成null
2.手動寫遞迴
var array = [,,
];function copy (obj) ;
if(typeof obj !== 'object')
for(var i in obj)
return newobj
}var copyarray = copy(array)
copyarray[0].number = 100;
console.log(array); // [, , ]
console.log(copyarray); // [, , ]
3.jquery深拷貝var copiedobject = $.extend(true, {}, originalobject)
js陣列,物件深拷貝
無事,封裝了乙個js深拷貝的方法 基本思路 deepcopy data data 可能是陣列也可能是物件 1.判斷data是陣列 物件或者其他資料型別 2.宣告空陣列 或者 空物件 res 3.分別處理 如果陣列元素或物件屬性值不是陣列或物件,空陣列或物件之間接收元素 res.push data i...
js 陣列物件深拷貝
結論 物件的拷貝不能採用直接賦值的方式。踩過的坑如下 formdata本來是父元件傳過來的,但是我不想直接用,於是我直接賦值給乙個formdatacopy的物件。但是詭異的事情發生了,就是在我填寫自己的表單元件的時候,一旦表單的資料發生的變化時,本來是formdatacopy的值發生變化,但是 fo...
js 陣列物件深拷貝
結論 物件的拷貝不能採用直接賦值的方式。踩過的坑如下 formdata本來是父元件傳過來的,但是我不想直接用,於是我直接賦值給乙個formdatacopy的物件。但是詭異的事情發生了,就是在我填寫自己的表單元件的時候,一旦表單的資料發生的變化時,本來是formdatacopy的值發生變化,但是 fo...