[解決済み] 1==1==1 は真を、"1"=="1"=="1 "は真を、"a"=="a"=="a "は偽を返すのはなぜか?重複
質問
function a() { return (1 == 1 == 1); }
function b() { return ("1" == "1" == "1"); }
function c() { return ("a" == "a" == "a"); }
上記のコードをChromeのコンソールでテストしてみたところ、なぜか
a()
は真を返します。
b()
は真を返し、そして
c()
は偽を返します。
なぜそうなるのでしょうか?
どのように解決するのですか?
1つ目の等式の(ブール値)結果と3つ目の(非ブール値)値を比較しているからです。
コードでは
1 == 1 == 1
と同じです。
(1 == 1) == 1
と同じです。
true == 1
.
つまり、3つのメソッドはよりシンプルに次のように書くことができます。
function a() { return (true == 1); }
function b() { return (true == "1"); }
function c() { return (true == "a"); }
これらの比較は、以下のように動作します。 これらのルール (強調)に従って動作します。
2 つのオペランドが同じ型でない場合、JavaScript はオペランドを変換します。 オペランドを変換し、厳密な比較を適用します。オペランドのどちらかが 数値またはブーリアンである場合、オペランドは可能であれば数値に変換されます。 可能 オペランドが文字列の場合は、文字列オペランドは可能な限り数値に変換されます。 は数値に変換されます。オペランドの両方がオブジェクトの場合 JavaScript は、オペランドがメモリ上の同じオブジェクトを参照している場合、等しい内部参照を比較します。 がメモリ内の同じオブジェクトを参照している場合、JavaScript は内部参照を比較します。
で何が起こるかというと
c
は、つまり
"a"
が数値に変換されることです(これにより
NaN
を与える)、その結果は
厳密に比較すると
になります。
true
は数値に変換されます。
1
).
から
1 === NaN
は
false
であれば、3番目の関数は
false
. 最初の2つの関数がなぜ
true
.
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] event.preventDefault() vs. return false
-
[解決済み] JavaScriptで文字列をbooleanに変換するにはどうしたらいいですか?
-
[解決済み] 私のJavaScriptコードは "No 'Access-Control-Allow-Origin' header is present on requested resource "というエラーを受け取りますが、Postmanはそうならないのはなぜですか?
-
[解決済み] JSONPとは何か、なぜ作られたのか?
-
[解決済み] なぜ ++[[]][+[] +[+[]] は "10" という文字列を返すのでしょうか?
-
[解決済み】jQueryでチェックボックスがチェックされているかどうかを確認するにはどうすればよいですか?
-
[解決済み] ジェスト あるクラスの特定のメソッドをモックする方法
-
[解決済み] 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における==と===の違い [重複].
-
[解決済み] なぜ(0 < 5 < 3)はtrueを返すのですか?
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み] JavaScriptで次の要素/前の要素を取得しますか?
-
[解決済み] 文字列のn番目の出現箇所を取得するには?
-
[解決済み] JavaScriptのtoString()関数をオーバーライドして、デバッグ用に意味のある出力を提供することは可能でしょうか?
-
[解決済み] 無効になっている入力フィールドの値を送信する
-
[解決済み] javascriptで文字列から関数を作成する方法はありますか?
-
[解決済み] モデルフェッチ時に1をtrueに、0をfalseに変換する方法
-
[解決済み] jQueryのバージョン1、バージョン2、バージョン3の違いは何ですか?[クローズド]