實現深淺拷貝

2021-09-25 16:56:58 字數 3121 閱讀 6623

1.淺拷貝(新陣列改變還會對原陣列影響)

array.slice()與array.concat()

var source = [1, null, undefined, , [2, 3, 4], function() {}]

var target = source.slice() || source.concat()

target[0] = 5

target[3].name = '====';

target[4][0] = 6

console.log(source) // [1, null, undefined, , [6, 3, 4], ƒ ()]

console.log(target) // [5, null, undefined, , [6, 3, 4], ƒ ()]

es6 擴充套件運算子

var source = [1, null, undefined, , [2, 3, 4], function() {}]

var target = [...source]

target[0] = 5

target[3].name = 'anpoly';

target[4][0] = 6

console.log(source) // [1, null, undefined, , [6, 3, 4], ƒ ()]

console.log(target) // [5, null, undefined, , [6, 3, 4], ƒ ()]

es6 object.assign()

var source = [1, null, undefined, , [2, 3, 4], function() {}]

var proto = object.getprototypeof(source)

var target = object.assign({}, object.create(proto), source)

target[0] = 5

target[3].name = 'anpoly'

target[4][0] = 6

console.log(source) // [1, null, undefined, , [6, 3, 4], ƒ ()]

console.log(target) // [5, null, undefined, , [6, 3, 4], ƒ ()]

2.深拷貝(徹底切斷了陣列內引用型別的引用關係)

json.parse()與 json.stringify()

var source = [1, null, undefined, , [2, 3, 4], function() {}]

var target = json.parse(json.stringify(source))

target['0'] = 5

target['3'].name = 'anpoly'

target['4'][0] = 8

console.log(source) // [1, null, undefined, , [2, 3, 4], ƒ ()]

console.log(target) // [5, null, null, , [6, 3, 4], null]

我們發現使用json.parse與json.stringify可以實現陣列的深拷貝。但是我們發現拷貝後的陣列與我們預想的結果有很大差別,這是因為json.stringify(…) 在物件中遇到 undefined 、 function 和 symbol 時會自動將其忽略, 在 陣列中則會返回 null (以保證單元位置不變)

1.淺拷貝

es6 object.assign()

var source2 = , 4:[2, 3, 4], 5: function() {}}

var obj = object.getprototypeof(source2)

var target = object.assign({}, object.create(obj), source2)

target['0'] = 5

target['3'].name = 'anpoly'

target['4'][0] = 6

console.log(source2) // , 4: [6, 3, 4], 5:ƒ ()}

console.log(target) // , 4: [6, 3, 4], 5:ƒ ()}

2.深拷貝

var source2 = , 4:[2, 3, 4], 5: function() {}}

var target = json.parse(json.stringify(source2))

target['0'] = 5

target['3'].name = 'anpoly'

target['4'][0] = 6

console.log(source2) // , 4: [2, 3, 4], 5:ƒ ()}

console.log(target) // , 4: [6, 3, 4]}

通過上面的這些拷貝技巧的分析,我們發現沒有乙個可以做到比較完整的深拷貝。那要如何實現乙個陣列或者乙個物件的深拷貝呢? 接下來我們將寫乙個簡單的轉殖函式來實現陣列與物件的深拷貝。

// 轉殖函式

var source = [1, null, undefined, , [2, 3, 4], function() {}]

function deepcopy(data)

for (var key in data)

return newdata

}var target = deepcopy(source)

target[0] = 5

target[3].name = 'anpoly'

target[4][0] = 6

console.log(source) // [1, null, undefined, , [2, 3, 4], ƒ ()]

console.log(target) // [5, null, undefined, , [6, 3, 4], ƒ ()]

js實現深淺拷貝

一 實現淺拷貝的方法 1 直接用 賦值 let a 0 1,2 3,4 b a console.log a b a 0 1 console.log a,b 兩個相同的 1,1,2,3,4 2 for in只迴圈第一層 只複製第一層的淺拷貝 function copy obj1 for let i i...

js物件實現深淺拷貝!!

物件淺拷貝 function objshallowcopy obj for var i in obj return obj2 物件深拷貝 function objdeepcopy obj1,obj2 最初的時候給他乙個初始值 它自己或者乙個json for var name in obj1 將要複製...

c 深淺拷貝 寫時拷貝實現

淺拷貝 在拷貝構造的時候,直接將原內容的位址交給要拷貝的類,兩個類共同指向一片空間。但是存在很大的缺陷 一旦對s2進行操作,s1的內容也會改變 析構時先析構s2,再析構s1,但是由於s1,s2指向同一片空間,會導致一片空間的二次析構導致出錯。深拷貝 通過開闢和源空間大小相同的空間並將內容拷貝下來再進...