js ディープコピー本題に入る前に、データがどのように保存されるかを理解する必要があります。 データ保存方法それについて説明する前に、まず値型と参照型がどのように格納されるかを知っておく必要があります。 JavaScript には 2 種類のデータがあります。 値の型: スタックメモリに格納される単純なデータセグメントで、データサイズが決定され、メモリ空間のサイズを割り当てることができます。 参照データ型: ヒープ メモリに格納されているオブジェクトの場合、ポインターはスタック メモリに格納され、このポインターはヒープ メモリ内の場所を指します。次に、ヒープ メモリから必要なデータを取得します。 ストレージは次のとおりです。 浅いコピー/深いコピーとは何か保存方法についてお話しした後は、浅いコピーと深いコピーについてお話ししましょう コピーはよくコピー、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 のその他のコンテンツにも注目していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: ユーザー エクスペリエンス デザイナーとは誰ですか?
Web プロジェクトを開発する場合、IIS をインストールする必要があります。IIS がインストール...
目次使用されるAPI簡単な例人.ts親コンポーネントサブコンポーネント効果要約する使用されるAPI ...
ドロップダウンメニューを書くには、ボタンをクリックします。メニューの入り口はアイコンボタンをクリック...
1. MySQL 自己接続MySQL では、情報を照会するときに自分自身に接続 (自己接続) する必...
この記事では、Vueの自己ネストツリーコンポーネントの使い方を参考までに紹介します。具体的な内容は次...
サーバーの負荷を軽減するために、ユーザーが入力するときにフロントエンドページで簡単な検証を実行する必...
目次変数データ型拡張ポイント要約する変数基本的な構文 var age=10; //ageという変数を...
序文最近プロジェクトに取り組んでいたとき、UI デザインのフォント サイズは 10 ピクセルでした。...
目次1. フォームイベント2. マウスイベント3. キーボードイベント4. 共通イベントメソッド(ウ...
目次1. はじめに2. データを消去するいくつかの方法2.1 ref() の使用2.2 スライスの使...
ハイパーフ公式サイトHyperf 公式ドキュメントのインストール1. Dockerの使用docker...
記事「MySQL の最適化: キャッシュの最適化」では、システムによってコンパイルされた変数値、また...
この記事では、スローモーションアニメーション効果を実現するためのJavaScriptの具体的なコード...
序文ミニプログラムを開発する過程では、録音機能を実装し、録音を再生し、録音をサーバーにアップロードす...
今日、PHP で作業しているときに、Xampp サーバーに付属の mysql データベースを使用する...