1. ホーム
  2. javascript

[解決済み] なぜ ('0' ? 'a' : 'b') と ('0' == true ? 'a' : 'b') は挙動が異なるのか [重複] [重複

2022-09-23 06:47:12

疑問点

次の2つの文の結果はなぜ違うのですか?

('0' ? 'a' : 'b') /* -> 'a' */
('0' == true ? 'a' : 'b') /* -> 'b' */

jsFiddleテストケース

編集してください。

私は、'0' の最初のステートメントを比較するためにブーリアンにキャストすることを疑うことを追加する必要があります - これは " '0' == true " とまったく同じであるべきです。 明らかに、これは真実ではありません。

どのように解決するのですか?

まず、念のため。

('0' ? 'a' : 'b') 

'a' であるため '0' a 空でない と評価される文字列で、常に true :

文字列です。結果は false 引数が空の文字列(長さが0)の場合。 それ以外の場合、結果は .


現在 '0' == true .

ここでは2つの型変換が行われます。これを仕様で追えばいいのです。 セクション 11.9.3, 抽象的な等価比較アルゴリズム .

オペランドは x であり y ( x == y ).

我々の場合 x は文字列 ( '0' ) と y はブール値( true ). したがって、ステップ7が実行されます。

Type(y)がBooleanの場合、x == ToNumber(y)の比較結果を返します。

booleanが数値に変換された場合。 を使用すると、次のような変換が行われます。 :

ブール値です。結果は 1 もし引数が . その結果は +0 もし引数が .

今、私たちは

'0' == 1

で、手順5の条件と一致します。

Type(x)がString、Type(y)がNumberの場合、ToNumber(x) == yの比較結果を返します。

文字列がどのように数値に変換されるかは、より複雑ですが、もちろん、この他にも の仕様です。 .

ということで、最終的な比較は

0 == 1

というのは false (ステップ1.a.vi.)