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

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

WBOY
リリース: 2016-05-16 16:29:57
オリジナル
1436 人が閲覧しました

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

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

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート