js における浅いコピーと深いコピーの詳細な説明

js における浅いコピーと深いコピーの詳細な説明

序文:

以下の記事を読む前に、記憶に関する知識を簡単に理解しましょう。以下は簡単な紹介です

1. jsメモリ

js のメモリ、またはほとんどの言語のメモリはスタックとヒープに分かれています。基本データ型の変数値はスタック上に割り当てられ、参照データ型の変数値はヒープ上に割り当てられます。スタックはヒープ内の特定のオブジェクトのアドレスのみを格納します。

2. 譲渡

基本データ型の場合、代入操作はコピーです。つまり、新しい変数と古い変数は互いに影響しません。

var a = 1;
var b = a;
2 = 2;
コンソールログ(b); // 2


参照データ型の場合、代入操作は、ヒープ内のオブジェクトを指す変数をスタックに追加するだけです。つまり、参照アドレスをコピーします。新しい変数と古い変数は相互に影響を及ぼします。つまり、新しい変数のオブジェクト値が変更されると、古い変数の対応する値も変更されます。

var a = {
    名前: 「マイク」
};
var b = a;
b.name = "ジャック";
console.log(a); // {名前: "jack"}

3. 浅いコピー

基本データ型とネストされたオブジェクトのないデータの場合、すべての操作はコピー操作であり、新しい変数と古い変数は相互に影響を与えません。

var a = {
    名前: 「マイク」
};
var b = {};
b.名前 = a.名前;
b.name = "ジャック";
console.log(a) // {名前: "mike"}

ただし、ネストされたオブジェクトを持つデータの場合、浅いコピーでは第 1 レベルのオブジェクトのみがコピーされ、より深いレベルの値は参照アドレスとしてコピーされたままになります。

var a = {
    名前: 「マイク」、
    言語:
        最初:「英語」、
        2番目:「中国語」
    }
};
var b = {};
b.名前 = a.名前;
b.name = "ジャック";
b.言語 = a.言語;
b.language.first = "日本語"
console.log(a) // { 言語 : {最初: "日本語"、2番目: "中国語"}}

js は浅いコピーを実装します。その考え方はtargetの各属性を走査し、属性名と値を新しい変数に割り当てるというものです。
代入の意味を理解していれば、コードの 4 行目では、 target[key]の値がオブジェクトの場合に、代入によって新しい変数が割り当てられ、基本的にはヒープ内の参照データ型のアドレスがコピーされます。浅いコピーでは、ネストされたオブジェクトであるかどうかによって結果が異なる理由を理解するのは難しくありません。

関数 shallowCopy(ターゲット) {
    結果を {} とします。
    for (const キー in ターゲット) {
        結果[キー] = ターゲット[キー];
    }
    結果を返します。
}

4. ディープコピー

ディープ コピーは完全なコピーであり、新しい変数と古い変数は互いに影響を及ぼしません。
パラメータがオブジェクトかどうかによって処理方法が異なります。オブジェクトの場合は、オブジェクトの各属性と値が割り当てられ、再帰的に処理されます。それ以外の場合は、直接返されます。

関数クローン(ターゲット) {
    if (typeof ターゲット === "オブジェクト") {
        //配列かどうかを判断します let result = Array.isArray(target)? [] : {};
        for (const キー in ターゲット) {
            結果[キー] = clone(ターゲット[キー]);
        }
        結果を返します。
    } それ以外 {
        ターゲットを返します。
    }
}

これで、js の代入の浅いコピーと深いコピーに関する詳細な記事は終わりです。js の代入の浅いコピーと深いコピーに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • ES6 における JavaScript 分割代入の一般的な使用法の概要
  • JavaScript の構造化代入を理解するのに役立つ記事
  • JavaScript 構造化分解割り当ての実践ガイド
  • JavaScript 構造化代入の詳細な説明
  • JS ES の新機能、変数分離割り当て
  • JavaScript の構造化代入の一般的なシナリオと例 5 つ
  • JS ES6 変数分割代入の詳細な説明
  • JavaScript の割り当て、浅いコピーと深いコピーの違い

<<:  UDP DUP タイムアウト UPD ポート状態検出コード例

>>:  MySQL SELECT文の実行方法

推薦する

マウスのドラッグ効果を実現するJavaScript

この記事では、マウスドラッグ効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

JavaScript における Promise の詳細な説明

目次Promise の基本的な使用法: 1. Promiseオブジェクトを作成する2. プロミス方式...

MySQLチュートリアルDMLデータ操作言語の例の詳細な説明

目次1. データ操作言語 (DML) 2. データを追加する(挿入) 3. 既存のテーブルをコピーし...

MySQL 5.7 のパフォーマンスと sys スキーマの監視パラメータの説明 (推奨)

1. パフォーマンス スキーマ: はじめにMySQL 5.7 では、多数の新しい監視項目の導入、ス...

HTML+CSS+jQuery はスクリーンショットで検索ホットリストタブ効果を模倣します

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

Centos8 で Docker を使用して Django プロジェクトをデプロイする詳細なチュートリアル

導入この記事では、django + uwsgi + nginx デプロイメントを使用して、Docke...

Viteは仮想ファイルの実装を導入します

目次背景仮想ファイルのインポート例書類タイプスクリプトのサポート要約する背景新しいプロジェクトで v...

W3C チュートリアル (2): W3C プログラム

W3C 標準化プロセスは 7 つの異なるステップに分かれています。 W3C 標準化プロセスは 7 つ...

JavaScriptはすべての選択と選択解除の操作を実装します

この記事では、JavaScriptで全選択と全選択解除の操作を実装するための具体的なコードを参考まで...

Vueのカスタムディレクティブの詳細なガイド

目次1. カスタム指示とは何ですか? 2. 指示をカスタマイズする方法フック機能3. 応用シナリオ入...

vue3+ts+EsLint+Prettier 標準コード実装

目次使用EsLintの使用プロフィールを追加するPrettierの使用huskyとlint-stag...

Vueのシンプルな状態管理ストアモードを理解する方法

目次概要1. store.jsを定義する2. store.js を使用するコンポーネント3. 成果を...

MySQL 文字セットの文字化けとその解決方法

序文文字セットは、一連のシンボルとエンコード規則です。Oracle データベースでも MySQL デ...

単一の Nginx IP アドレスに複数の SSL 証明書を設定する例

デフォルトでは、Nginx は IP アドレスごとに 1 つの SSL 証明書のみをサポートします。...

IDEA が Docker を統合してリモート展開を実現するための詳細な手順

1. Dockerサーバーへのリモートアクセスを有効にするdocker が配置されているリモート サ...