ホームページ ウェブフロントエンド jsチュートリアル JS配列とオブジェクトの深いコピーと浅いコピーの詳細な説明

JS配列とオブジェクトの深いコピーと浅いコピーの詳細な説明

Feb 01, 2018 am 09:03 AM
javascript コピー 詳しい説明

この記事では主に js の配列とオブジェクトの深いコピーと浅いコピーについて詳しく紹介します。興味のある方は参考にしていただければ幸いです。

前提:値を代入する際のプリミティブデータ型とオブジェクト型の違い

JavaScriptのデータ型はプリミティブデータ型とオブジェクト型に分けられます。この 2 つはメモリ内で異なる方法で保存されるため、割り当てに違いが生じます。それぞれ栗を取ってみましょう


var x = 1;
 var y = x; //y获得了和x同样的值
 y = 2;
 console.log(x); // 1

 var m = [1,2]; //m存放的是指向[1,2]这个数组对象的引用地址
 var n = m; //n也获得 [1,2]数组对象的引用地址
 n[0] = 3;
 console.log(m); //[3,2]
ログイン後にコピー

上の栗からわかるように、元のデータ型が割り当てられると、割り当て後に実際のデータ値が与えられ、2 つの値は同じになりません。相互に影響を与えますが、オブジェクト タイプは元のデータの参照アドレスを与えるため、Shangli の配列など、本質的に同じデータ オブジェクトであるため、古いデータと新しいデータは相互に影響します。浅いコピー?

名前が示すように、浅いコピーは表面的なコピー方法であり、属性値がオブジェクト型の場合、オブジェクトデータへの参照のみがコピーされるため、古いデータと新しいデータが完全に分離されず、それぞれに影響を与えます。他の。別の例を見てみましょう...

//测试数据
var array1 = ['a',1,true,{name:'lei',age:18}];
 
//concat() slice() 实现浅拷贝
var array2 = array1.concat()
 
//修改拷贝后的数据
array2[0] = 'b';      //array1[0]是原始数据类型 所以是直接赋值的
array2[3].name = 'zhang';  //array1[3]是对象数据类型 所以拷贝的是对象的引用,其实还是和原数组使用同一对象
 
console.log(array1);  // ['a',1,true,{name:'zhang',age:18}]
ログイン後にコピー

この例では、array2 は array1 の浅いコピー オブジェクトであり、配列要素は元のデータ型であり、相互に影響しません (array1[0])。ただし、array1[3] ] はオブジェクト タイプであり、引き続き相互に影響します。

浅いコピーの実装方法


Shangli の Array.concat() または array.slice() は、配列の浅いコピーを実装する特別な方法です。

自分で実装するにはどうすればよいですか?オブジェクト/配列の各属性を走査して、それを新しいオブジェクトに割り当てるだけで十分ではないでしょうか? 実装は次のとおりです


 //实现浅拷贝
 function shallowCopy( target ){
  if(typeof target !== 'object') return ;
  //判断目标类型,来创建返回值
  var newObj = target instanceof Array ? [] : {};
 
  for(var item in target){
   //只复制元素自身的属性,不复制原型链上的
   if(target.hasOwnProperty(item)){
    newObj[item] = target[item]
   }
  }
 
  return newObj
 }</strong>
 
 //测试
 
 var test = [1,&#39;a&#39;,{name:&#39;lei&#39;,age:18}];
 
 var copy = shallowCopy(test);
 console.log(copy[2].name);  //lei
 
 copy[2].name = &#39;zhang&#39;;
 console.log(test[2].name);  //zhang  原数据也被修改
ログイン後にコピー


深いコピーとその実装


浅いコピーから説明すると、基本的に、ディープ コピーは「完全な」コピーであることがわかります。コピー後、古いデータと新しいデータは完全に分離され、オブジェクト タイプの属性値は共有されなくなり、相互に影響を与えなくなります。

実装方法:

トリッキーなメソッド JSON.parse(JSON.stringify(Obj))


var test = [1,&#39;a&#39;,{name:&#39;lei&#39;,age:18}]; 
var copy1 = JSON.parse(JSON.stringify(test)); //特殊方式 
console.log(copy1); 
copy1[2].name = &#39;zhang&#39;
console.log(test);  //[1,&#39;a&#39;,{name:&#39;lei&#39;,age:18}] 未受到影响
ログイン後にコピー

注: このメソッドは、属性値が関数であるオブジェクトをディープコピーすることはできません。自分で試すことができます

2 . 深いコピーを実装する

浅いコピーを実装しましたが、よく考えてみると、オブジェクトタイプの属性値を割り当てる場合、結果的には完全な分離にはならないはずです。値を取得し、その上で再度ディープ コピーを呼び出すことで、次のようにディープ コピーが実現されます。アドレスはコピーされますが、同じデータ オブジェクトは引き続き使用されます。 したがって、ディープ コピーを実装する方法は、オブジェクト タイプの属性値を再帰的にディープ コピーして、直接の割り当てを回避することです。

関連する推奨事項:

JQuery の $.extend のシャロー コピーとディープ コピーの例の分析

js のディープ コピーとシャロー コピーとは何か、およびそれらの実装方法

jQuery でディープ コピーとシャロー コピーを実装する

以上がJS配列とオブジェクトの深いコピーと浅いコピーの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Win11での管理者権限の取得について詳しく解説 Win11での管理者権限の取得について詳しく解説 Mar 08, 2024 pm 03:06 PM

Windows オペレーティング システムは世界で最も人気のあるオペレーティング システムの 1 つであり、その新バージョン Win11 が大きな注目を集めています。 Win11 システムでは、管理者権限の取得は重要な操作であり、管理者権限を取得すると、ユーザーはシステム上でより多くの操作や設定を実行できるようになります。この記事では、Win11システムで管理者権限を取得する方法と、権限を効果的に管理する方法を詳しく紹介します。 Win11 システムでは、管理者権限はローカル管理者とドメイン管理者の 2 種類に分かれています。ローカル管理者はローカル コンピュータに対する完全な管理権限を持っています

Oracle SQLの除算演算の詳細説明 Oracle SQLの除算演算の詳細説明 Mar 10, 2024 am 09:51 AM

OracleSQL の除算演算の詳細な説明 OracleSQL では、除算演算は一般的かつ重要な数学演算であり、2 つの数値を除算した結果を計算するために使用されます。除算はデータベース問合せでよく使用されるため、OracleSQL での除算演算とその使用法を理解することは、データベース開発者にとって重要なスキルの 1 つです。この記事では、OracleSQL の除算演算に関する関連知識を詳細に説明し、読者の参考となる具体的なコード例を示します。 1. OracleSQL での除算演算

PHPモジュロ演算子の役割と使い方を詳しく解説 PHPモジュロ演算子の役割と使い方を詳しく解説 Mar 19, 2024 pm 04:33 PM

PHP のモジュロ演算子 (%) は、2 つの数値を除算した余りを取得するために使用されます。この記事では、モジュロ演算子の役割と使用法について詳しく説明し、読者の理解を深めるために具体的なコード例を示します。 1. モジュロ演算子の役割 数学では、整数を別の整数で割ると、商と余りが得られます。たとえば、10 を 3 で割ると、商は 3 になり、余りは 1 になります。モジュロ演算子は、この剰余を取得するために使用されます。 2. モジュロ演算子の使用法 PHP では、% 記号を使用してモジュロを表します。

Linuxシステムコールsystem()関数の詳細説明 Linuxシステムコールsystem()関数の詳細説明 Feb 22, 2024 pm 08:21 PM

Linux システム コール system() 関数の詳細説明 システム コールは、Linux オペレーティング システムの非常に重要な部分であり、システム カーネルと対話する方法を提供します。その中でも、system()関数はよく使われるシステムコール関数の一つです。この記事では、system() 関数の使用法を詳しく紹介し、対応するコード例を示します。システム コールの基本概念 システム コールは、ユーザー プログラムがオペレーティング システム カーネルと対話する方法です。ユーザープログラムはシステムコール関数を呼び出してオペレーティングシステムを要求します。

Linuxのcurlコマンドの詳しい説明 Linuxのcurlコマンドの詳しい説明 Feb 21, 2024 pm 10:33 PM

Linuxのcurlコマンドの詳細な説明 要約:curlは、サーバーとのデータ通信に使用される強力なコマンドラインツールです。この記事では、curl コマンドの基本的な使用法を紹介し、読者がコマンドをよりよく理解して適用できるように実際のコード例を示します。 1.カールとは何ですか? curl は、さまざまなネットワーク要求を送受信するために使用されるコマンド ライン ツールです。 HTTP、FTP、TELNETなどの複数のプロトコルをサポートし、ファイルアップロード、ファイルダウンロード、データ送信、プロキシなどの豊富な機能を提供します。

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

Linux ゼロコピー テクノロジをわかりやすく説明する 6 枚の写真 Linux ゼロコピー テクノロジをわかりやすく説明する 6 枚の写真 Feb 22, 2024 pm 06:40 PM

みなさん、こんにちは。今日は Linux のゼロコピー テクノロジについて話しましょう。 sendfile システム コールをエントリ ポイントとして使用して、ゼロコピー テクノロジの基本原理を深く調査します。ゼロコピーテクノロジーの中心的な考え方は、データ伝送経路を最適化することでメモリ間のデータのコピーを最小限に抑え、データ伝送の効率とパフォーマンスを向上させることです。 1. ゼロコピー技術の紹介 Linux のゼロコピー技術は、データ転送を最適化する技術であり、カーネルモードとユーザーモード間のデータコピー数を減らし、データ転送の効率を向上させます。データ送信のプロセス中、通常、送信を完了する前に、データをカーネル バッファからアプリケーション バッファにコピーし、次にアプリケーション バッファからネットワーク デバイスのバッファにコピーする必要があります。ゼロコピーテクノロジーの利点

C言語学習ルートを詳細に分析 C言語学習ルートを詳細に分析 Feb 18, 2024 am 10:38 AM

ソフトウェア開発の分野で広く使用されているプログラミング言語として、C 言語は多くの初心者プログラマーにとって最初の選択肢です。 C言語を学ぶと、プログラミングの基礎知識を定着させるだけでなく、問題解決能力や思考力も向上します。この記事では、初心者が学習プロセスをより適切に計画できるようにするための C 言語学習ロードマップを詳しく紹介します。 1. 基本的な文法を学ぶ C 言語の学習を始める前に、まず C 言語の基本的な文法規則を理解する必要があります。これには、変数とデータ型、演算子、制御ステートメント (if ステートメント、

See all articles