深いクローンと浅いクローンについて話します.
3858 ワード
JavaScriptの中の深浅クローンの心得を共有します.間違ったところがあります.ご検討ください.
JavaScriptの値は2種類に分けられています.基本タイプの値、参照タイプの値は深さクローン(データタイプの次の書き込み)に関係します.
浅いクローン(show clone)
浅いクローンは名前の通り、表面のクローン方式を比較して、個人の感覚はマッピング関係です.
いくつかの浅いクローンの例を挙げます.
しかし、データ構造が複雑になると、浅いクローンは足りなくなります.
深クローン(deep clone)
クローニングに必要なのは、コールバック関数という思想です.
JavaScriptの値は2種類に分けられています.基本タイプの値、参照タイプの値は深さクローン(データタイプの次の書き込み)に関係します.
浅いクローン(show clone)
浅いクローンは名前の通り、表面のクローン方式を比較して、個人の感覚はマッピング関係です.
いくつかの浅いクローンの例を挙げます.
// for
var a = [3, 4, 5, 6]
var b = []
for(var i = 0; i < a.length; i++){
b.push(a[i]);
}
console.log(b);
//b = [3, 4, 5, 6]
// map
var a = [22, 33, 44, 55];
var b = a.map(item => item);
// ...
var a = [22, 33, 44, 55];
var b = [...a];
これらの3つは、浅いクローンで比較的一般的な方法です.これらのデータ構造は比較的簡単です.だから、浅いクローンで完全に一つのクローンを作ることができます.しかし、データ構造が複雑になると、浅いクローンは足りなくなります.
var a = [ 1, 2, 3, { a : 1, b : 3, cc : [9,8,7] } ];
現在は深クローンを使う必要があります.深クローン(deep clone)
クローニングに必要なのは、コールバック関数という思想です.
var deepClone = function(arr){
var result;
if (Array.isArray(arr)) {
result = [];
for (let i = 0; i < arr.length; i++) {
result.push(deepClone(arr[i]));
}
}else if ( typeof arr == 'object'){
result = {};
for (const key in arr) {
result[key] = deepClone(arr[key])
}
}else{
result = arr
}
return result;
}
var a = [1,2,3,{a:1,b:3,cc:[9,8,7]}];
var b = deepClone(a)
var c = JSON.parse(JSON.stringify(a))
a[3].cc[0] = 100;
console.log(a);
console.log(b);
console.log(c);
//a [ 1, 2, 3, { a: 1, b: 3, cc: [ 100, 8, 7 ] } ]
//b [ 1, 2, 3, { a: 1, b: 3, cc: [ 9, 8, 7 ] } ]
//c [ 1, 2, 3, { a: 1, b: 3, cc: [ 9, 8, 7 ] } ]
その中の変数cはJSON.parse()を使っています.またJSON.strigify()が共同で使うのも同じ効果があります.