ホームページ >ウェブフロントエンド >jsチュートリアル >Javascriptのミディアムコピーとディープコピーについての簡単な説明_基礎知識

Javascriptのミディアムコピーとディープコピーについての簡単な説明_基礎知識

WBOY
WBOYオリジナル
2016-05-16 16:29:571425ブラウズ

JavaScript では、オブジェクト変数間のすべての代入はアドレスを渡します。どのオブジェクトがオブジェクトなのかを尋ねる生徒もいるかもしれません。例を挙げた方がよいかもしれません:

コードをコピーします コードは次のとおりです:

typeof(true) //"ブール値"
typeof(1) //「数値」
typeof("1") //"文字列"
typeof({}) //「オブジェクト」
typeof([]) //「オブジェクト」
typeof(null) //「オブジェクト」
typeof(function(){}) //"関数"

実際、ディープコピーで処理する必要がある主なオブジェクトは、オブジェクト以外のオブジェクトであり、通常は直接割り当てる必要があります。 js ディープ コピーの実装に関する私のアイデアは次のとおりです:

オブジェクトのすべてのプロパティを走査します。
属性が「オブジェクト」の場合、特別な処理が必要です。
このオブジェクトが特別で配列である場合は、新しい配列を作成し、配列内の要素を深くコピーします
このオブジェクトが非配列オブジェクトの場合は、そのオブジェクトに対してディープ コピー メソッドを再帰的に呼び出します。
「オブジェクト」でない場合は、普通にコピーしてください。

以下は私の実装です:

コードをコピーします コードは次のとおりです:

Object.prototype.DeepCopy = function () {
var obj, i;
obj = {};

(この中の属性) {
If (this.hasOwnProperty(attr)) {
If (typeof(this[attr]) === "オブジェクト") {
If (this[attr] === null) {
obj[attr] = null;
}
else if (Object.prototype.toString.call(this[attr]) === '[オブジェクト配列]') {
obj[attr] = [];
for (i=0; i obj[attr].push(this[attr][i].DeepCopy());
}
} else {
obj[attr] = this[attr].DeepCopy();
}
} else {
obj[attr] = this[attr];
}
}
}
obj を返します;
};

ブラウザが ECMAScript 5 をサポートしている場合、オブジェクト プロパティのすべてのプロパティをディープ コピーするには、

を使用できます。

コードをコピーします コードは次のとおりです:

Object.defineProperty(obj, attr, Object.getOwnPropertyDescriptor(this, attr));

に置き換えます

コードをコピーします コードは次のとおりです:

obj[attr] = this[attr];

このメソッドを Object.prototype に直接実装する利点は、すべてのオブジェクトがこのメソッドを継承することです。欠点は、ライブラリによっては Object オブジェクトも書き換えるため、競合が発生する場合があることです。これは注意すべきことです。具体的な利用方法は以下の通りです。

コードをコピーします コードは次のとおりです:

Object.prototype.DeepCopy = function () { ... }
var a = { x:1 };
var b = a;
var c = a.DeepCopy();
a.x = 2;
b.x = 3;
console.log(a.x); //3
console.log(b.x); //3
console.log(c.x); //1

上記はディープコピーについての説明ですが、今日はディープコピーについて話したので、シャローコピーにも対応したいと思います。

浅いコピー (シャドウ クローン): オブジェクトの基本タイプとオブジェクト タイプのみがコピーされ、元の参照に属します。
ディープコピー (ディープクローン): オブジェクトの基本クラスをコピーするだけでなく、元のオブジェクト内のオブジェクトもコピーします。つまり、まったく新しいオブジェクトが生成されます。

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