浅い放射
13490 ワード
0.基準値JavaScriptは、データを元の値と参照値として変数に格納することができる. 元の値は単純なデータです.数字列、文字列、boolean、undefinedなどがあります. 参照値はメモリに格納されているオブジェクトです.オブジェクトを操作する場合、オブジェクト自体ではなくオブジェクトの参照が操作されます. 元の値はコピー時に他のメモリにコピー値を割り当て、元の値とコピー値は互いに影響しない. 参照値はコピー値ではなくコピー参照(メモリのアドレス)です. 1.浅い放射線浅い複製は最上位のオブジェクトのみを生成することを意味し、内部オブジェクトは参照関係である. Array.prototype.slice・ オーバーラップ構造であれば内部要素が参照をコピーするので、完全コピーとは言えない. 展開演算子もコピーできますが、オーバーラップ構造はコピーできません. ・ これも深くコピーできない. 深度コピーとは、内部オブジェクトまで再生成してコピーすることである. JSON.stringify, JSON.parse・ 文字列は元の値であり、上記の方法で新しいオブジェクトが生成される. もちろん、重ね合わせ構造をコピーしてもよい. ただし、関数が要素の場合はコピーできません. ふくしゃ簡単に再帰関数で内部から再生成して複製してもよい. 深度コピーを実現したライブラリがある. javascript内での深度コピーは思ったよりずっと面倒だと思います. 参照値のコピーについては認知しているが、実際に使用する際に深いコピーが必要かどうかは考慮する必要があるかもしれない.
Array.prototype.slice
ターゲット配列から要素を取り出し、新しい配列を作成して値を入れる.start、endがない場合は、配列全体をコピーします.let arr = [1, 2, 3];
let copiedArr = arr.slice(); // copiedArr = [1, 2, 3];
copiedArr.push(4);
//arr = [1, 2, 3];
//copiedArr = [1, 2, 3, 4];
let arr = [1, 2, [3, 4]];
let copiedArr = arr.slice(); // copiedArr = [1, 2, [3, 4]];
copiedArr[2].push(5);
//arr = [1, 2, [3, 4, 5]];
//copiedArr = [1, 2, [3, 4, 5]];
Spread Operatorlet arr = [1, 2, [3, 4]];
let copiedArr = [...arr]; // copiedArr = [1, 2, [3, 4]];
copiedArr[2].push(5);
//arr = [1, 2, [3, 4, 5]];
//copiedArr = [1, 2, [3, 4, 5]];
Object.assignObject.assign
ソースオブジェクトからターゲットオブジェクトに属性をコピーできます.let arr = [1, 2, [3, 4]];
let copiedArr = Object.assign([], arr); // copiedArr = [1, 2, [3, 4]];
copiedArr[2].push(5);
//arr = [1, 2, [3, 4, 5]];
//copiedArr = [1, 2, [3, 4, 5]];
2.深さ放射JSON.stringify
データを文字列に変換JSON.parse
変形した文字を元のオブジェクトに戻す.let arr = [1, 2, [3, 4]];
let copiedArr = JSON.parse(JSON.stringify(arr)); // copiedArr = [1, 2, [3, 4]];
copiedArr[2].push(5);
//arr = [1, 2, [3, 4]];
//copiedArr = [1, 2, [3, 4, 5]];
let arr = [1, 2, [3, 4]];
function copy(someArr) {
let result = [];
for (let el of someArr) {
if (typeof el === 'object') {
result.push(copy(el));
} else {
result.push(el);
}
}
return result;
}
let copiedArr = copy(arr); // copiedArr = [1, 2, [3, 4]];
copiedArr[2].push(5);
//arr = [1, 2, [3, 4]];
//copiedArr = [1, 2, [3, 4, 5]];
ライブラリ(Lodash,Ramda)const _ = require('lodash');
let arr = [1, 2, [3, 4]];
let copiedArr = _.cloneDeep(arr); // copiedArr = [1, 2, [3, 4]];
copiedArr[2].push(5);
//arr = [1, 2, [3, 4]];
//copiedArr = [1, 2, [3, 4, 5]];
3.終わりの言葉Reference
この問題について(浅い放射), 我々は、より多くの情報をここで見つけました https://velog.io/@jeongho3786/얕은-복사-깊은-복사テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol