[JavaScript] 論理演算子をもうちょっと調べてみる

経緯

先日後輩のJSについての相談を受けていたとき、以下のような書き方をみて「こんな感じに書けるんですねー」と言われました。

window.hoge = default_hoge || {};

結構、普段から使ったりはしていますが、なぜ、これが「default_hogeがundefinedやnilだったら{}にする」という意味になるのか、明確に答えられなかったので、そのことについて調べてみました。

||の意味

||は脳内で「or」って呼んだりしますが、実際、意味はorとは限らないようです。そもそも Bool型を返すとは限らない ので論理演算と呼ぶこと自体が違うのかもしれません。

実際は||は左側がfalse, 0, undefined, null, '', NaNだったとき、右側の値を返し、それ以外は左側の値を返すという演算です。

上の例の場合ではdefault_hogefalse, 0, undefined, null, '', NaNだった場合、||の右側にある{}window.hogeを代入することになります。また、default_hogeにそれ以外の値が入っていた場合、そのままwindow.hogeに代入されます。

false || trueという記述の場合、trueになるため、あたかもorであるかのように振る舞うということのようです。

&&の意味

&&も似たようなものです。

左側がfalse, 0, undefined, null, '', NaN 以外 だったとき、右側の値を返し、それ以外は左側の値を返すという演算になります。

この結果、false && trueは左側が返りfalse, true && trueは右側の値が返り、falseというand演算のように振る舞います。

まとめ

何気なく慣用句的に使っているコードも調べてみると、アハ体験ができて嬉しいです。