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 のその他のコンテンツにも注目していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: ユーザー エクスペリエンス デザイナーとは誰ですか?
目次プロセスコミュニケーションプロセス間の双方向通信問題要約するサードパーティのデータ サプライヤー...
オーバーフロー非表示指定された高さを超えるテキストや画像情報を非表示にすることを意味します。 <...
目次1.entires() メソッドの詳細な構文2.entires() メソッドの一般的な使用法と注...
この記事では、例を使用して、MySQL データベースのデータ テーブルの最適化、外部キーの使用、およ...
いくつかの理由(好奇心も含む)から、数週間前に Linux デスクトップとして Xfce を使い始め...
目次なぜパーティションが必要なのでしょうか?パーティショニング戦略パーティションの危険性なぜパーティ...
1. まず、TomcatログのエンコーディングとIdeaログ表示コンソールのエンコーディングを区別す...
目次1. スクリプトvim環境2. シェルスクリプトで環境を定義する方法3. シェルスクリプト内の翻...
Mysql マスタースレーブ同期の Last_IO_Errno:1236 エラーの原因は何ですか? ...
HTML と XHTML の違い1. XHTML要素は正しくネストされている必要がある2. XHT...
信頼性が高く、人気があり、簡単に構成できる Web サーバーである Apache で独自の Web ...
テキストエリアタグのサイズは不変ですコードをコピーコードは次のとおりです。 <textarea...
MySQL パスワードを忘れた場合の解決策: [root@localhost ~]# mysql -...
mysql のデフォルトのストレージ ディレクトリは/var/lib/mysql/です。以下は、デフ...
システムをインタラクティブに監視したい場合は、htop コマンドが最適な選択肢の 1 つです。 ht...