天天看點

javascript中對數組對象的深度拷貝

在前端開發的某些邏輯中,經常需要對現有的js對象建立副本,避免污染原始資料的情況。

如果是簡單的一維數組對象,可以使用兩個原生方法:

1、splice

var arr1 = ['a', 'b', 'c'];
var arr2 = arr1.splice(0);
console.info(arr1);
arr2[1] = 'x';
console.info(arr1);      

2、concat

var arr1 = ['a', 'b', 'c'];
var arr2 = [].concat(arr1);
console.info(arr1);
arr2[1] = 'x';
console.info(arr1);      

那如果是多層級的數組對象,再用上面的兩個方法就有問題了

雖然最上層會建立副本,但每層下面的資料還是會引用原來的對象

對于這種情況,可以利用jquery的extend方法進行深度拷貝:

3、$.extend

var arr1 = [
    { 'id': 1, 'name': 'a' },
    { 'id': 2, 'name': 'b' },
    { 'id': 3, 'name': 'c' }
]
var arr2 = $.extend(true, {}, arr1);
console.info(arr1);
arr2[1].name = 'x';
console.info(arr1);      

另外,$.extend也能對任何js對象建立深度拷貝,需要注意的是第一個參數要傳入true,否則隻是拷貝第一層屬性

其實在實際開發中,$.extend還可以做的更多

寵辱不驚,看庭前花開花落;去留無意,望天上雲卷雲舒

繼續閱讀