JavaScript|浅いレプリケーションvs深いレプリケーション
8901 ワード
JavaScriptで変数を処理すると、値の再割り当て、既存の値の一部の抽出、または複数の方法でデータを処理できます.変数が元の値である場合、値は変わらないため、コピーは元の値に影響しませんが、コードが長時間参照値をコピーすると、既存の値が見つかりにくくなり、値がどのように変化しているかがわかりにくくなります.従って,基準値を処理するためには,浅い放射と深い放射を理解しなければならない.
このようにして既存のアレイをコピーすると、
ただし、参照値を持つ変数の場合、浅いコピーで元の値に変更されます.
💡 ちょっと待ってTIP!!
元のデータ型
-固定記憶領域を占有するデータ
-オブジェクト以外でメソッドを持たないタイプ
: Number , Symbol, String , Boolean , Null , Undefined ...
-値自体は変更できません(可変ではありません)が、変数に他のデータを割り当てることができます.
リファレンスタイプ
-すべての元のデータではありません:配列、オブジェクト、関数など
・複数のデータを有する動的に増大したHEAPと呼ばれる特殊な記憶領域が使用される.
-データが存在するアドレスが変数に格納されるように変数のアドレスを参照します.
:コピーを作成せずに元のデータを参照するためにデータ値をインポートします.
🤷🏻♀️ では、どのようにしてアレイにコピーしますか?
スプレッドシート演算子を使用して、配列からコピーされた新しい変数がソースに影響しないようにします.厳密には、コピーではなく元の値を受信する新しいオブジェクトを作成します.
オブジェクトをコピーするときに1回目のコピーしかできないため、オブジェクト内のオブジェクトからなるデータを変更すると元のオブジェクトに変更されます.
したがって、深度コピーを行うには、オブジェクトを文字列に変換し、文字列をオブジェクトに再変換する必要があります.
:フルスライスコピーの方法
オブジェクトには->文字列->オブジェクトのプロシージャが必要です.
次の図に示すように、profileという名前のオブジェクトをprofile 2にコピーし、profile 2を変更しても元のファイルには影響しません. JSON.parse()-オブジェクトを文字列 に変更します. JSON.stringgify()-文字列をオブジェクト に置き換える方法
ただし、このプロシージャをコードに移行すると、ロジックに時間がかかるため、作成したライブラリ(「Lodash」)の使用を推奨します.
💡 TIP !
理解を助けるサイト👉🏻 MDN , ブログの開発
🙊 ブログは整理しやすく、理解に役立ちます.
𘈀▼▼▼▼▼▼▼▼▼▼▼▼▼▼
このようにして既存のアレイをコピーすると、
let A = "hello";
let B = A;
console.log(A); // "hello"
console.log(B); // "hello"
B = "World";
console.log(A); // "hello"
console.log(B); // "World"
変数Aには元の値があるため、既存の値をコピーした後に変数Bの値を再割り当てしても元の値は変わりません.ただし、参照値を持つ変数の場合、浅いコピーで元の値に変更されます.
💡 ちょっと待ってTIP!!
元のデータ型
-固定記憶領域を占有するデータ
-オブジェクト以外でメソッドを持たないタイプ
: Number , Symbol, String , Boolean , Null , Undefined ...
-値自体は変更できません(可変ではありません)が、変数に他のデータを割り当てることができます.
リファレンスタイプ
-すべての元のデータではありません:配列、オブジェクト、関数など
・複数のデータを有する動的に増大したHEAPと呼ばれる特殊な記憶領域が使用される.
-データが存在するアドレスが変数に格納されるように変数のアドレスを参照します.
📚 浅い放射
:コピーを作成せずに元のデータを参照するためにデータ値をインポートします.
let arr = [1,2,3]
let a = arr
a[0] = 4
console.log(a) //결과 : [4,2,3]
console.log(arr) //결과 : [4,2,3]
このように、参照値を持つ変数aのみが変化するが、aはarr配列の値であるため、元の値arrの値も変化する.🤷🏻♀️ では、どのようにしてアレイにコピーしますか?
スプレッドシート演算子を使用して、配列からコピーされた新しい変数がソースに影響しないようにします.厳密には、コピーではなく元の値を受信する新しいオブジェクトを作成します.
let num = [1,2,3]
let number = num
number.push(3) // 결과 : num과 number 모두 [1,2,3,3]
//스프레드 사용 시,
let num = [1,2,3]
let number = [...num]
number.push(3)
//결과 : num = [1,2,3]
//number = [1,2,3,3]
これにより、配列値を参照するアドレスではなく、新しいオブジェクトをコピーでき、元のオブジェクトに影響を与えません.🙅🏻♀️ 表計算ドキュメントを使用するときは注意してください。
オブジェクトをコピーするときに1回目のコピーしかできないため、オブジェクト内のオブジェクトからなるデータを変更すると元のオブジェクトに変更されます.
したがって、深度コピーを行うには、オブジェクトを文字列に変換し、文字列をオブジェクトに再変換する必要があります.
🔏 ふかほうしゃ
:フルスライスコピーの方法
let arr1 = [1, 2, 3, 4];
let arr2 = arr1.slice();
console.log(arr1); //결과 : [1, 2, 3, 4]
console.log(arr2); //결과 : [1, 2, 3, 4]
arr2[0] = 0;
console.log(arr1); //결과 : [1, 2, 3, 4]
console.log(arr2); //결과 : [0, 2, 3, 4]
console.log(arr1 === arr2); //false
したがって、参照値を持つ変数については、メソッドを使用して深さレプリケーションを行い、既存の配列に影響を及ぼさないように新しい配列を作成できます.オブジェクトには->文字列->オブジェクトのプロシージャが必要です.
次の図に示すように、profileという名前のオブジェクトをprofile 2にコピーし、profile 2を変更しても元のファイルには影響しません.
ただし、このプロシージャをコードに移行すると、ロジックに時間がかかるため、作成したライブラリ(「Lodash」)の使用を推奨します.
💡 TIP !
理解を助けるサイト👉🏻 MDN , ブログの開発
🙊 ブログは整理しやすく、理解に役立ちます.
Reference
この問題について(JavaScript|浅いレプリケーションvs深いレプリケーション), 我々は、より多くの情報をここで見つけました https://velog.io/@kjh2868/JavaScript-얕은-복사-vs-깊은-복사テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol