国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

JavaScript オブジェクトを適切に複製するにはどうすればよいですか?
P粉334721359
P粉334721359 2023-08-23 12:26:59
0
2
632
<p>オブジェクト <code>x</code> があります。これをオブジェクト <code>y</code> としてコピーして、<code>y</code> への変更によって <code>x</code> が変更されないようにしたいと考えています。組み込み JavaScript オブジェクトから派生したオブジェクトをコピーすると、余分な不要なプロパティが作成されることに気づきました。私は獨(dú)自のテキストで構(gòu)築したオブジェクトの 1 つをコピーしているので、これは問題ではありません。 </p> <p>JavaScript オブジェクトを適切に複製するにはどうすればよいですか? </p>
P粉334721359
P粉334721359

全員に返信(2)
P粉691958181

オブジェクトで Date、Function、Unknown、regExp、または Infinity を使用していない場合、非常に単純な行は JSON.parse(JSON.stringify(object)) です。

リーリー
これは、オブジェクト、配列、文??字列、ブール値、數(shù)値を含むすべてのタイプのオブジェクトに適用されます。

ワーカーとの間でメッセージをパブリッシュするときに使用される構(gòu)造化クローン アルゴリズム ブラウザ

については、この記事も參照してください。ディープ クローン作成機(jī)能も含まれています。

P粉122932466

2022年更新

構(gòu)造化クローニングと呼ばれる新しい JS 標(biāo)準(zhǔn)があります。多くのブラウザで動(dòng)作します (「使用できますか 」を參照)。 リーリー

古い答え

これを JavaScript で任意のオブジェクトに対して実行することは、決して単純でも簡単でもありません。オブジェクトのプロトタイプからプロパティを誤って取得するという問題に遭遇します。プロパティは、新しいインスタンスにコピーされるのではなく、プロトタイプに殘される必要があります。たとえば、

clone メソッドを Object.prototype に追加する場合 (一部の回答が示唆しているように)、そのプロパティを明示的にスキップする必要があります。しかし、Object.prototype にその他のメソッドが追加されている場合や、知らない他の中間プロトタイプがある場合はどうなるでしょうか?この場合、コピーすべきではないプロパティをコピーしているため、hasOwnProperty メソッドを使用する必要があります。

列挙できないプロパティに加えて、非表示のプロパティを持つオブジェクトをコピーしようとすると、さらに厄介な問題に遭遇します。たとえば、

prototype は関數(shù)の隠し屬性です。さらに、オブジェクトのプロトタイプはプロパティ __proto__ を通じて參照されますが、これも非表示であり、ソース オブジェクトのプロパティを反復(fù)する for/in ループによってコピーされません。 __proto__ は Firefox の JavaScript インタプリタに固有であり、他のブラウザでは異なる可能性があると思いますが、アイデアは理解できますか。すべてが數(shù)えられるわけではありません。非表示のプロパティの名前がわかっている場合は、それをコピーできますが、それを自動(dòng)的に検出する方法はわかりません。

洗練されたソリューションを探す際のもう 1 つの障害は、プロトタイプの継承を正しく設(shè)定するという問題です。ソース オブジェクトのプロトタイプが

Object の場合は、{} を使用して新しい汎用オブジェクトを作成するだけですが、ソース オブジェクトのプロトタイプが Object の場合は、子孫コード>、その場合、hasOwnProperty フィルターを使用してスキップされたプロトタイプ內(nèi)の他のメンバー、またはそもそも列挙可能ではなかったプロトタイプ內(nèi)の他のメンバーが失われます。解決策の 1 つは、ソース オブジェクトのコンストラクター プロパティを呼び出して初期コピー オブジェクトを取得し、その後プロパティをコピーすることですが、それでも列挙不可能なプロパティは取得できません。たとえば、Date code> オブジェクトは、そのデータを非表示メンバーとして保存します。 リーリー

d1

の日付文字列は、d2 より 5 秒後になります。ある Date を別の Date と同一にする方法は、setTime メソッドを呼び出すことですが、これは Date クラスに固有です。この問題に対する確実な普遍的な解決策はないと思いますが、間違っていることは幸いです。

一般的なディープ コピーを?qū)g裝する必要があったとき、私は最終的に妥協(xié)して、通常の Object、Array、Date代碼>、をコピーするだけでよいと考えました。 String代碼>、Number代碼>、または Boolean代碼>。最後の 3 つのタイプは不変なので、変更されることを気にせずに淺いコピーを?qū)g行できます。さらに、Object または Array に含まれる要素も、このリストの 6 つの単純型の 1 つであると仮定します。これは次のようなコードで実行できます:

リーリー

オブジェクトと配列內(nèi)のデータがツリー構(gòu)造を形成している限り、前述の 6 つの単純な型には上記の関數(shù)で十分です。つまり、オブジェクト內(nèi)の同じデータは 1 回だけ參照されます。例えば:### リーリー

これは JavaScript オブジェクトを処理できませんが、投げたものだけで動(dòng)作すると考えない限り、多くの目的には十分かもしれません。

最新のダウンロード
詳細(xì)>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート