2016-08-05 7 views
1

学習JavaScriptとこれが与えられたとき、以下の式を考えると、それがtrueと評価ことが判明:transitive([1], 1, {toString:_=>'1'});JavaScriptの推移平等

私は理由を理解していません。

yとzが等しいことは理にかなっていますが、xとzが等しくない場合、xとyはどのように等しくなりますか?

function transitive(x,y,z) { 
    return x && x == y && y == z && x != z; 
} 
+2

厳密な等価演算子 '==='を使用して、値だけでなく型と値の両方をチェックします。 –

+4

私は[小さなツール](https://nem035.github.io/js-equality-algorithms/)を作ったが、役に立つかもしれない。このツールはエンジンがどのように実際に '=='と '==='を評価するのかを示します(強制的にどのようにしているのかを含む)ので、何が起こっているのかを正確に見ることができます。 – nem035

+1

@ nem035すばらしいツール。平等チェックで何が起こっているのかを理解するのに本当に役立ちます。 – jcjunction

答えて

-1

JavaScriptには、「真実性」と「虚偽」という概念があります。 1'1'のような値は、==のような緩やかな比較演算子と比較すると等しいですが、厳密な等価演算子===を使用して厳密に等しくはありません。

オブジェクトは1と等価です。JavaScriptはオブジェクトをプリミティブと同等の値に変換するために型強制を使用するためです。これは、オブジェクトの.toString()メソッドを呼び出すことによって行います。これは'1'を返します。上記で学んだように、1のように真実であるので、==を使用すると等しいとみなされます。

これはおそらく関連性があります:MDN: Equality comparisons and sameness

==!=の代わりに、常に===!==を使用するのがJavaScriptで最も一般的です。

+1

質問には答えません。 – Tushar

+0

私はより直接的な答えを加えました。私の答えがそれほど適切ではなかったことを指摘してくれてありがとう。 – TW80000

+0

@ TW80000なので、型変換を使用すると、xとzはプリミティブではないので、等しくないのですか? yはプリミティブなので比較は? – jcjunction