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指向同一片空間,會導致一片空間的二次析構導致出錯。深拷貝 通過開闢和源空間大小相同的空間並將內容拷貝下來再進...