4

「===」を使用すると型が比較されることを理解しているため、次のコードを実行すると、数値型と文字列型を比較しているため、「等しくない」という結果になります。

var a = 20;
var b = "20";
    if (a === b) {
        alert("They are equal");
    } else {
        alert("They are not equal");
}

しかし、「==」を使用して値のみを比較すると、「それらは等しい」というメッセージが表示される方法がわかりません。

var a = 20;
var b = "20";
    if (a == b) {
        alert("They are equal");
    } else {
        alert("They are not equal");
}

値はどのように等しいですか? 文字列 "20" は ASCII 文字の 50 と 48 (2 進数では 0110010 と 0110000) として格納され、20 は実際の 2 進数 0010100 として格納されていませんか?

編集:みんなありがとう!すべての回答は素晴らしく、これをよりよく理解するのに役立ちました。

4

6 に答える 6

19

==演算子は、変数の値のみを比較します。タイプが異なる場合は、変換が実行されます。したがって、数値 20 は文字列 "20" に変換され、結果が比較されます。

===演算子は値だけでなく型も比較するため、キャストは実行されません。この場合"20" !== 20

于 2008-11-02T17:28:29.687 に答える
3

型変換が必要な場合、JavaScript は String、Number、Boolean、または Object オペランドを次のように変換します。

  • 数値と文字列を比較する場合、文字列は数値に変換されます。JavaScript は、文字列の数値リテラルを Number 型の値に変換しようとします。まず、文字列の数値リテラルから数学的な値が導出されます。次に、この値は最も近い Number 型の値に丸められます。
  • オペランドの 1 つがブール値の場合、ブール値オペランドは、真の場合は 1 に変換され、偽の場合は +0 に変換されます。
  • オブジェクトが数値または文字列と比較される場合、JavaScript はオブジェクトのデフォルト値を返そうとします。演算子は、オブジェクトの valueOf および toString メソッドを使用して、オブジェクトをプリミティブ値、String または Number 値に変換しようとします。このオブジェクトの変換に失敗すると、実行時エラーが生成されます。

== 比較の問題は、JavaScript バージョン 1.2 は型変換を実行しないのに対し、バージョン 1.1 および 1.3 以降は実行することです。

=== 比較はバージョン 1.3 以降で利用可能で、2 つの変数の一致をチェックする最良の方法です。

コードを JavaScript コードのバージョン 1.1、1.2、および 1.3 と互換性を持たせる必要がある場合は、実行されている === 比較であるかのように変数がすべて一致することを確認する必要があります。

于 2008-11-03T23:43:37.807 に答える
2

JavaScript エンジンは a を数値と見なし、評価の前に b を数値にキャストします。

于 2008-11-02T17:29:26.317 に答える
1

「==」の定義の一部は、可能な場合、比較の前に値が同じ型に変換されることです。これは、多くの緩やかに型付けされた言語に当てはまります。

于 2008-11-02T17:29:31.917 に答える
1

Javascript は、数字を含む文字列がその数字と「等しい」と見なされるように設計されています。その理由は、ユーザーが入力フィールドに数値を入力し、サイトが JS でそれを検証する場合の使いやすさです。比較する前に、入力された文字列を数値にキャストする必要はありません。

一般的なユースケースを簡素化し、 === 演算子を使用して、考慮されているタイプと比較することもできます。

于 2008-11-02T17:30:13.567 に答える
0

私が知る限り、JavaScript はその場で自動データ型変換を行います。そのため、変数は同等の型に自動的にキャストされる可能性があります。

于 2008-11-02T17:30:01.570 に答える