[解決済み] 2つのJavaScriptオブジェクトの等質性を判断する方法は?
質問
厳密な等号演算子は、2つのオブジェクトが タイプ は等しい。しかし、2つのオブジェクトが等しいかどうかを判断する方法はあるのでしょうか。 ハッシュコードと同じように の値は、Javaの値ですか?
Stack Overflowの質問 JavaScriptでhashCode関数のようなものはありますか? はこの質問と似ていますが、より学術的な答えが必要です。上のシナリオは、なぜそれが必要なのかを示しています。 同等の解決策 .
どのように解決するのですか?
簡単な答え
シンプルな答えです。あるオブジェクトが他のオブジェクトと等しいと判断する一般的な方法はありません。例外は、オブジェクトが型なしであることを厳密に考えている場合です。
長い答え
コンセプトは、2つの異なるオブジェクトのインスタンスを比較して、それらが値レベルで等しいかどうかを示すEqualsメソッドというものです。ただし、Equals メソッドをどのように定義するかは、特定の型に任されています。
Equals
メソッドを実装する必要があります。原始的な値を持つ属性の反復比較だけでは十分ではないかもしれません。オブジェクトには、等質性に関係のない属性が含まれていることがあります。例えば
function MyClass(a, b)
{
var c;
this.getCLazy = function() {
if (c === undefined) c = a * b // imagine * is really expensive
return c;
}
}
この上記の場合
c
は、MyClass の任意の2つのインスタンスが等しいかどうかを判断するのにあまり重要ではありません。
a
と
b
が重要です。場合によっては
c
はインスタンス間で異なるかもしれないが、比較の際には重要ではない。
この問題は、メンバー自身がある型のインスタンスである可能性があり、これらのそれぞれが等質性を判断する手段を持つことが要求される場合に適用されることに注意してください。
さらに複雑なのは、JavaScriptではデータとメソッドの区別が曖昧であることです。
あるオブジェクトがイベントハンドラとして呼び出されるメソッドを参照することがありますが、これはおそらくその「値の状態」の一部とはみなされないでしょう。一方、別のオブジェクトには、重要な計算を行う関数が割り当てられていることがあり、それによってこのインスタンスは、単に別の関数を参照しているというだけで、他のインスタンスとは異なるものになります。
既存のプロトタイプのメソッドの1つを別の関数でオーバーライドしたオブジェクトはどうでしょうか?この場合でも、他のインスタンスと同一と見なせるでしょうか?この質問には、それぞれの型に対するそれぞれのケースで答えるしかありません。
先に述べたように、例外は厳密に型付けされないオブジェクトでしょう。この場合、唯一の賢明な選択は、各メンバーの反復的かつ再帰的な比較です。その場合でも、関数の「値」とは何かということを考えなければならない。
関連
-
Vueはランニングライト形式のテキストを水平方向にスクロールする機能を実装している
-
HTML5 LocalStorage ローカルストレージとセッションストレージの使用法
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでメールアドレスを検証するのに最適な方法は何ですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み] JavaScriptのオブジェクトが空であることをテストするにはどうすればよいですか?
-
[解決済み] 2つのJavaScriptオブジェクトのプロパティを動的にマージするにはどうすればよいですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
JavaScriptの関数この指摘の問題を説明
-
jsを使った簡単な照明スイッチのコード
-
vueはopenlayersを使用してスカイマップとガオードマップをロードする
-
Vueのフォームイベントのデータバインディングの説明
-
Vueの一般的な組み込みディレクティブの説明
-
[解決済み】リソースの読み込みに失敗した:Bind関数でサーバーが500(Internal Server Error)のステータスで応答した【非公開
-
[解決済み] TypeError: $.ajax(...) is not a function?
-
[解決済み】JavaScriptでインラインIF文の書き方は?
-
JavaScriptのgetElementById()メソッド入門
-
[解決済み] JavaScriptでのオブジェクト比較 [重複]