jsのディープコピーを理解しましょう

jsのディープコピーを理解しましょう

js ディープコピー

本題に入る前に、データがどのように保存されるかを理解する必要があります。

データ保存方法

それについて説明する前に、まず値型と参照型がどのように格納されるかを知っておく必要があります。

JavaScript には 2 種類のデータがあります。

値の型: StringNumberBooleanNullUndefinedSymbol

スタックメモリに格納される単純なデータセグメントで、データサイズが決定され、メモリ空間のサイズを割り当てることができます。

参照データ型: Object(ArrayFunction

ヒープ メモリに格納されているオブジェクトの場合、ポインターはスタック メモリに格納され、このポインターはヒープ メモリ内の場所を指します。次に、ヒープ メモリから必要なデータを取得します。

ストレージは次のとおりです。

ここに画像の説明を挿入

浅いコピー/深いコピーとは何か

保存方法についてお話しした後は、浅いコピーと深いコピーについてお話ししましょう

コピーはよくコピー、ctrl+c、ctrl+vなどと呼ばれますが、例を見てみましょう

値型と参照型にそれぞれ値を割り当てる場合。

     変数a = 5
     var b = a
     b += 5
     コンソールログ('a=' + a,'b=' + b)
     var arr = [1,2,3]
     var brr = arr
     brr.push(10)
     console.log("arr は",arr)
     console.log("brr is",brr)

ここに画像の説明を挿入

現象:値型は互いに影響を及ぼさないが、配列(参照型)brr配列は要素を追加するとarr配列を変更することがわかりました。

説明と分析: 浅いコピーは参照型でのみ発生します。参照型で単純な割り当てを実行すると、ヒープ メモリへのポインターのみが割り当てられます。これを浅いコピーと呼びます。ディープ コピーは、アドレス ポインターではなく、参照型の完全なコピーです。

次の回路図の浅いコピーを取得します。

ここに画像の説明を挿入

一般的なディープコピーの実装

したがって、参照型を割り当てるときは、元のデータに影響を与える浅いコピーを作成してはなりません。次にディープコピーを行う必要があります

1. JSON.stringifyとJSON.parseを通じて

配列とオブジェクトは深くコピーできますが、関数はコピーできません。オブジェクトまたは配列のネストされたコピーを作成できます。

デメリット: オブジェクト内のメソッドのディープコピーは不可能

使用

     var brr = JSON.parse(JSON.stringify(arr))

例:

  var arr = {
         名前:「ロマンティック コーダー」
         年齢: 20,
         住所: ['江西', '長沙'],
         友達:
             友人1: '張三'、
             友人2: '李思'
         },
         関数(){
             console.log("私はロマン主義の対象です")
         }
     }
     var brr = JSON.parse(JSON.stringify(arr))
     brr.name='無法犯罪者、張三'
     brr.adress[0]='長沙'
     console.log("arr は", arr)
     console.log("brr is", brr)

ここに画像の説明を挿入

2. スプレッド演算子

オブジェクトの構造割り当て機能方式を活用します。

デメリット: オブジェクト内のネストされたオブジェクトのディープコピーはありません。これは、参照オブジェクトの1つのレイヤーのみをディープコピーするのと同じです。

使用:

     var brr = {...arr}

例:

  var arr = {
         名前:「ロマンティック コーダー」
         年齢: 20,
         住所: ['江西', '長沙'],
         友達:
             友人1: '張三'、
             友人2: '李思'
         },
         関数(){
             console.log("私はロマン主義の対象です")
         }
     }
     var brr = {...arr}
     brr.name='無法犯罪者、張三'
     brr.adress[0]='長沙'
     console.log("arr は", arr)
     console.log("brr is", brr)

ここに画像の説明を挿入

3. 手書きの再帰的なディープコピー機能

完璧な解決策

関数:

  //再帰を使用してディープコピーを実装する function deepClone(obj) {
         //コピーされた obj がオブジェクトか配列かを判断します var objClone = Array.isArray(obj) ? [] : {};
         if (obj && typeof obj === "object") { //obj は空にできず、null もオブジェクトであるため、オブジェクトまたは配列である必要があります。
             for (キー in obj) {
                 obj.hasOwnProperty(キー) の場合 {
                     if (obj[key] && typeof obj[key] === "object") { //objの属性値は空ではなく、まだオブジェクトなので、ディープコピーを作成します。objClone[key] = deepClone(obj[key]); //再帰的にディープコピーを作成します。} else {
                         objClone[key] = obj[key]; //直接コピー}
                 }
             }
         }
         objClone を返します。
     }

例:

      var arr = {
         名前:「ロマンティック コーダー」
         年齢: 20,
         住所: ['江西', '長沙'],
         友達:
             友人1: '張三'、
             友人2: '李思'
         },
         楽しい: 関数(){
             console.log("私は " + this.name + " のオブジェクトです")
         }
     }
     var brr = deepClone(arr)
     brr.name = '無法者張三'
     brr.adress[0] = '長沙'
     console.log("arr は", arr)
     arr.fun()
     console.log("brr is", brr)
     brr.fun()
 ​
     //再帰を使用してディープコピーを実装する function deepClone(obj) {
         //コピーされた obj がオブジェクトか配列かを判断します var objClone = Array.isArray(obj) ? [] : {};
         if (obj && typeof obj === "object") { //obj は空にできず、null もオブジェクトであるため、オブジェクトまたは配列である必要があります。
             for (キー in obj) {
                 obj.hasOwnProperty(キー) の場合 {
                     if (obj[key] && typeof obj[key] === "object") { //objの属性値は空ではなく、まだオブジェクトなので、ディープコピーを作成します。objClone[key] = deepClone(obj[key]); //再帰的にディープコピーを作成します。} else {
                         objClone[key] = obj[key]; //直接コピー}
                 }
             }
         }
         objClone を返します。
     }

ここに画像の説明を挿入

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • jsオブジェクトの浅いコピーと深いコピーの詳細な説明
  • JavaScript配列のディープコピーとシャローコピーの2つの方法
  • JavaScript でのオブジェクトのディープコピー
  • JS の配列のディープコピーの実装方法の分析
  • JavaScriptディープコピー(deepClone)の詳しい説明
  • js ディープコピー関数
  • JavaScript の基本: 浅いコピーと深いコピー (浅いコピーと深いコピー)
  • JSで浅いコピーと深いコピーを実装するためのコードの詳細な説明
  • javascript ディープコピー
  • JavaScriptディープコピーの実装例

<<:  ユーザー エクスペリエンス デザイナーとは誰ですか?

>>:  入力タイプとは何を意味し、入力を制限する方法

推薦する

ハンドラー PageHandlerFactory-Integrated のモジュール リストに不正なモジュール ManagedPipelineHandler が含まれています

Web プロジェクトを開発する場合、IIS をインストールする必要があります。IIS がインストール...

Angularの親子コンポーネント通信の詳細な説明

目次使用されるAPI簡単な例人.ts親コンポーネントサブコンポーネント効果要約する使用されるAPI ...

CSS メニューボタンアニメーション

ドロップダウンメニューを書くには、ボタンをクリックします。メニューの入り口はアイコンボタンをクリック...

MySQLの自己接続と結合の詳細な理解

1. MySQL 自己接続MySQL では、情報を照会するときに自分自身に接続 (自己接続) する必...

Vueの自己ネストツリーコンポーネントの使い方の詳細な説明

この記事では、Vueの自己ネストツリーコンポーネントの使い方を参考までに紹介します。具体的な内容は次...

JavaScript はパスワードボックスの入力検証を実装します

サーバーの負荷を軽減するために、ユーザーが入力するときにフロントエンドページで簡単な検証を実行する必...

Javascriptの基本を詳しく説明

目次変数データ型拡張ポイント要約する変数基本的な構文 var age=10; //ageという変数を...

フロントエンドブラウザのフォントサイズが12px未満のソリューション

序文最近プロジェクトに取り組んでいたとき、UI デザインのフォント サイズは 10 ピクセルでした。...

一般的なイベントを処理するための JavaScript の使用に関する詳細な説明

目次1. フォームイベント2. マウスイベント3. キーボードイベント4. 共通イベントメソッド(ウ...

Vue で配列をクリアするいくつかの方法 (要約)

目次1. はじめに2. データを消去するいくつかの方法2.1 ref() の使用2.2 スライスの使...

Docker で hyperf を開発する完全な使用例の詳細な説明

ハイパーフ公式サイトHyperf 公式ドキュメントのインストール1. Dockerの使用docker...

MySQL 最適化接続最適化

記事「MySQL の最適化: キャッシュの最適化」では、システムによってコンパイルされた変数値、また...

スローモーションアニメーション効果を実現するJavaScript

この記事では、スローモーションアニメーション効果を実現するためのJavaScriptの具体的なコード...

ミニプログラム録画機能の実装

序文ミニプログラムを開発する過程では、録音機能を実装し、録音を再生し、録音をサーバーにアップロードす...

Xampp サーバーで MySQL パスワードを変更する方法 (画像付き)

今日、PHP で作業しているときに、Xampp サーバーに付属の mysql データベースを使用する...