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文の実行方法

推薦する

MySQL での数値のフォーマットの詳細な説明

最近、仕事の都合で、MySQL で数字をフォーマットする必要がありましたが、インターネット上にはほと...

HTML の基本 - CSS スタイルシート、スタイル属性、フォーマット、レイアウトの詳細

1.位置:固定一部の Web サイトの右下隅にあるポップアップ ウィンドウなどの、ブラウザーを基準と...

LinuxでHomebrewを使用する正しい方法

多くの人が Linux Homebrew を使用しています。これをより良く使用するための 3 つのヒ...

MySQL 8.0.11 インストール概要チュートリアル図

インストール環境: CAT /etc/os-release CentOS システムのバージョン情報を...

WeChatアプレットがシンプルな計算機機能を実装

WeChatアプレット:シンプルな計算機、参考までに、具体的な内容は次のとおりです。ミニプログラムに...

CentOS 6 は Docker を使用して Redis マスター スレーブ データベース操作例を展開します

この記事では、Docker を使用して Centos6 に Redis マスター/スレーブ データベ...

MySQL インデックスの使用方法 (単一列インデックスと複数列インデックス)

1. 単一列インデックスどの列にインデックスを作成するかを選択することは、パフォーマンス最適化プロ...

ローカル yum ソースの設定、国内 yum ソースの設定、epel ソースの設定を行う Linux の手順

1. ローカルyumソースを設定する1. ISOイメージをマウントする マウント -o loop /...

モバイルインターネット時代: レスポンシブウェブデザインが一般的なトレンドに

今はモバイルインターネットが急速に発展している時代です。スマートフォンやタブレットはますます普及し、...

Vue3.0 で Vuex 状態管理を開始する方法をすぐに習得します

Vuex は、Vue.js アプリケーション専用に開発された状態管理パターンです。集中型ストレージを...

Javascript ツリー メニュー (11 項目)

1. dhtmlxツリー dHTMLxTree は機能豊富なツリー メニュー コントロールです。豊...

MySQL は information_schema オブジェクトの付与をバイパスし、ERROR 1044 (4200) エラーを報告します

この質問は、MySQL の権限に関する WeChat グループのネットユーザー間の議論です。次のよう...

ログインフォームを実装するためのReactサンプルコード

Vue ユーザーとして、React を拡張する時が来ました。antd の導入、less と rout...

純粋な CSS3 で美しい入力ボックスアニメーションスタイルライブラリを実現 (テキスト入力愛)

純粋な CSS3 で実装された美しい入力ボックス アニメーション スタイル ライブラリを共有します ...

Docker 実行時にユーザーとグループを管理する方法

Docker はプロセスを中核としてシステムリソースを分離する管理ツールです。分離は、オペレーティン...