JavaScript 配列と非配列オブジェクトのディープ クローンとシャロー クローンの原則の詳細な説明

JavaScript 配列と非配列オブジェクトのディープ クローンとシャロー クローンの原則の詳細な説明

シャロークローニングとディープクローニングとは何ですか?

浅いクローン: スタックに格納されている値を対応する変数に直接割り当てます。基本データ型の場合は、対応する値が直接割り当てられます。参照型の場合は、アドレスが割り当てられます。
ディープクローニング: 対応する変数にデータを割り当てて、ソースデータとは無関係な新しいデータを生成します (データアドレスが変更されています)。つまり、オブジェクトの各レベルのプロパティです。
JavaScript では、基本データ型は記号「=」を使用して複製できますが、参照データ型では、実際の複製操作を実行せずに、変数のポインターを変更するためにのみ記号「=」を使用します。

1. アレイのクローンを作成する

1.1 浅いクローニング

for ループを使用して浅いクローンを作成します。

var arr1 = ['デモ', 1, 2];
var arr2 = [];
// 配列の浅いクローン for (var i = 0; i < arr1.length; i++) {
    arr2[i] = arr1[i];
}
コンソールログ(arr2);
コンソールにログ出力します。

出力:

配列(3)0: "デモ"1: 12: 2長さ: 3[[プロトタイプ]]: 配列(0)
間違い

1.2 ディープクローニング

ディープクローニングには再帰を使用します。

関数 deepClone(o) {
	var 結果 = [];
	(var i = 0; i < o.length; i++) の場合 {
		結果.push(deepClone(o[i]));
	}
	結果を返します。
}

2. 配列以外のオブジェクトの複製

2.1 浅いクローニング

for ループを使用して浅いクローンを作成します。

var obj1 = { a: 1, b: 2, c: 3, d: [4, 5, { e: 'デモ' }] };
var obj2 = {};
// オブジェクトの浅いクローン for (var i in obj1) {
    obj2[i] = obj1[i];
}
コンソールログ(obj2);
コンソールにログ出力します。(obj1 == obj2);

出力:

{a: 1、b: 2、c: 3、d: 配列(3)}
間違い

2.2 ディープクローニング

ディープクローニングには再帰を使用します。

関数 deepClone(o) {
	var 結果 = {};
	(変数 i が o の場合) {
		結果[i] = deepClone(o[i]);
	}
	結果を返します。
}

3. ディープクローン機能を統合

var obj1 = { a: 1, b: 2, c: 3, d: [4, 5, { e: 'デモ' }] };
var arr1 = ['デモ', 1, 2];
// ディープクローン関数 deepClone(o) {
    Array.isArray(o) の場合 {
        // は配列です var result = [];
        (var i = 0; i < o.length; i++) の場合 {
            結果.push(deepClone(o[i]));
        }
    } そうでない場合 (typeof o == 'object') {
        // 配列ではなくオブジェクトです var result = {};
        (変数 i が o の場合) {
            結果[i] = deepClone(o[i]);
        }
    } それ以外 {
        // 基本型の値 var result = o;
    }
    結果を返します。
}
コンソールにログ出力します。
コンソールにログ出力します。

これで、JavaScript 配列と非配列オブジェクトのディープ クローンとシャロー クローンの詳細な原​​則に関するこの記事は終了です。JavaScript 配列に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScript で知らない Object.entries の使い方
  • js 配列 fill() 充填メソッド
  • js配列forEachインスタンスの詳細な使用方法
  • JavaScript配列の重複排除のいくつかの方法についての詳細な説明
  • 任意の長さの配列を作成または埋めるための JS のヒントの要約
  • JavaScript配列重複排除の詳細な説明
  • js 配列エントリ() 反復メソッドを取得する

<<:  MySQLとSpringの自動コミットの詳細な説明

>>:  Centos8.2 クラウド サーバー環境に Tomcat8.5 をインストールするための詳細なチュートリアル

推薦する

Vueベースのビデオプレーヤーの実装例

既存のビデオ プレーヤーがニーズを満たせない場合は、ビデオを自分でカプセル化する必要があります。ビデ...

VMware 仮想マシンのインストール win7 オペレーティング システム チュートリアル ダイアグラム

VMwareaのインストールプロセスは説明しませんが、主にwin7イメージをロードする方法を説明しま...

SpringBootをDockerにデプロイし、jarパッケージを置き換える方法の詳細な説明

目次プロジェクトディレクトリDockerファイルファイルの展開画像を生成するコンテナを起動するウェブ...

URL 書き換えモジュール 2.1 URL 書き換えモジュールのルール記述

目次前提条件テストページの設定書き換えルールの作成命名規則モードの定義アクションの定義設定ファイル内...

VScode リモート SSH リモート編集とデバッグコード

Visual Studio Code の最新の Insider バージョンには、コードのリモート デ...

js を使用して画像をモザイク化する方法の例

この記事では、主に js を使用して画像をモザイク化する方法の例を紹介し、次のように共有します。効果...

dockerを使用してTomcatをデプロイし、Skywalkingに接続する

目次1. 概要2. dockerを使用してTomcatをデプロイし、Skywalkingに接続する要...

CentOS に MySQL をインストールしてリモート アクセスを設定する方法

1. MySQLリポジトリソースをダウンロードする$ wget http://repo.mysql....

Vue3の一般的なAPIの使用方法の紹介

目次ライフサイクルの変化反応的な参照vue2.x では ref を使用して要素タグを取得します。vu...

Dockerでプロジェクトを実行する方法

1. プロジェクトwarが保存されているディレクトリを入力しますDockerfileを編集する vi...

Vue プロジェクトにインターフェース リスニング マスクを追加する方法

1. 事業背景マスク レイヤーを使用してユーザーの異常な操作を遮断する方法は、フロントエンドでよく使...

カルーセル効果を実現するための純粋なjs

この記事では、カルーセルマップの効果を実現するためのjsの具体的なコードを参考までに共有します。具体...

VMware に Centos8 をインストールする詳細なチュートリアル

CentOS公式サイトアドレスhttps://www.centos.org/まず必要なファイルをダウ...

Centos8.2 クラウド サーバー環境に Tomcat8.5 をインストールするための詳細なチュートリアル

Tomcatをインストールする前に、まずJDK環境をインストールしてくださいLinux サーバー上で...

イントラネット侵入を実現するためのSSHポート転送

LAN 内のマシンは外部ネットワークにアクセスできますが、外部ネットワークは内部ネットワークにアクセ...