メモログ

💡 Personal notes about somthing I'm interested in

Converting to Boolean in an if expression

if(0)はfalseだがif('0')はtrueになるというメモ。

if文はif (Expression) Statement1 else Statement2と記述し、Expressionを評価してtrueの場合はStatement1が実行されてfalseの場合はStatement2が実行される(13.6.7Runtime Semantics: Evaluation)。

Expressionの中身が単項式(primary expressions)の場合、Booleanへ変換されて評価される。Booleanの変換に関する仕様は7.1.2ToBoolean ( argument )に記されており、文字列の場合は空文字列のみがfalseとして扱われ、それ以外はtrueになる。だから '0''false'という文字列はBooleanに変換されるとtrueになる。

抽象的な等価性比較 (Abstract Equality Comparison) ==の場合、比較する値を共通の型に変換(type coercion)するけれど、その時の仕様が11.9.3 The Abstract Equality Comparison Algorithmにある。x == yの場合にどちらかが数値でどちらかが文字列だと、文字列の方が数値に変換されて比較される。どちらか文字列でどちらかがbooleanの場合は、xとyがともに数値に変換されて比較される。なので '0' == true0 == 1という比較になりfalseになるし、'0' == false0 == 0となりtrueになる(一方'false' == truefalseだが、'false' == falsefalseになる)。

if('0')true==で比較をしているわけではない。単項式の場合は数値へ変換は介さずに文字列がそのままBooleanへと変換される。if('0' == true)はfalseとなるが、if('0')はtrueになる。この仕様はifに渡される値の型が明確に分かっていない(または分かっていたつもりだったが異なっていた)場合に問題となる。0をfalsyと扱う時に渡される値が厳密にはわからない場合はそれが本当に数値であるかを事前に確認した方が良い。

その他参考