1. ホーム
  2. javascript

[解決済み] 2つのJavaScriptオブジェクトの等質性を判断する方法は?

2022-03-19 11:46:05

質問

厳密な等号演算子は、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つのインスタンスが等しいかどうかを判断するのにあまり重要ではありません。 ab が重要です。場合によっては c はインスタンス間で異なるかもしれないが、比較の際には重要ではない。

この問題は、メンバー自身がある型のインスタンスである可能性があり、これらのそれぞれが等質性を判断する手段を持つことが要求される場合に適用されることに注意してください。

さらに複雑なのは、JavaScriptではデータとメソッドの区別が曖昧であることです。

あるオブジェクトがイベントハンドラとして呼び出されるメソッドを参照することがありますが、これはおそらくその「値の状態」の一部とはみなされないでしょう。一方、別のオブジェクトには、重要な計算を行う関数が割り当てられていることがあり、それによってこのインスタンスは、単に別の関数を参照しているというだけで、他のインスタンスとは異なるものになります。

既存のプロトタイプのメソッドの1つを別の関数でオーバーライドしたオブジェクトはどうでしょうか?この場合でも、他のインスタンスと同一と見なせるでしょうか?この質問には、それぞれの型に対するそれぞれのケースで答えるしかありません。

先に述べたように、例外は厳密に型付けされないオブジェクトでしょう。この場合、唯一の賢明な選択は、各メンバーの反復的かつ再帰的な比較です。その場合でも、関数の「値」とは何かということを考えなければならない。