ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript のシャローコピーとディープコピーの違い

JavaScript のシャローコピーとディープコピーの違い

PHP中文网
PHP中文网オリジナル
2017-06-23 10:44:541602ブラウズ

浅いコピーと深いコピーが何であるかを理解する前に、まず JavaScript の値型と参照型のストレージ特性を理解する必要があります。

1. 値の型は次の 2 つの型に分類されます:
基本データ型: 文字列、数値、ブール値、未定義、null
複合データ型: 配列、オブジェクト、関数、日付、正規表現...

2. ` 2.1 基本的なデータ型代入例

   var num = 123;
   var num2 = num;

"

* 値型代入の格納特性は、変数内のデータをすべてコピーして新しい変数に格納します。
* `var num = 123` は格納される数を表します変数には 123 があります。
* 次に、データをコピーします。つまり 123 をコピーします。すると、メモリ内にデータが 2 つあります
* コピーしたデータを `num2` に代入します。 num2 の変数値を変更しても、変数には影響しません。 num
の変数値 * メモリ上に**データのコピー**が2つあるのが特徴です。


「2.2 複合データ型の代入例

var o = { name: '张三' };
var obj = o;

* 変数に格納されているデータをコピーする代入ですoを実行し、データをコピーします objにデータを代入します
※メモリ上にデータのコピーが1つだけ存在し、オブジェクトoとオブジェクトobjのname属性値が同じアドレスを指しているのが特徴です
* 問題: オブジェクト obj の name 属性を変更すると、元のオブジェクト o の名前に影響します。

次に問題は、複合データ型がそれ自身のオブジェクトに影響を与えずに別のオブジェクトに値を割り当てる方法です。別のオブジェクトが値を変更するときの値は何ですか?
以下に私の理解を説明しましょう: 深いコピーと浅いコピー

1. 深いコピーとは何ですか?

浅いコピーとは何ですか?現在のオブジェクトの属性のみをコピーし、現在のオブジェクトの属性は、タイプを参照するときには考慮されません​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​: : : 、 、 、 :

var deepCopy = function () {
   // 1, 创建一个对象
   var temp = {};
   // 2, 拷贝属性, 判断如果是引用类型需要深拷贝
   for ( var k in this ) {
      if ( typeof this[ k ] === 'object' ) {
         temp[ k ] = this[ k ].deepCopy();
      } else {
         temp[ k ] = this[ k ];
      }
      // temp[ k ] = this[ k ];
   }
   // 3, 返回对象
   return temp;
};

上記はディープコピー

の実装方法です。

以上がJavaScript のシャローコピーとディープコピーの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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