最近、サイ本を読んでいます。 その中で少し驚いたものを一つ紹介したいと思います。
以下の論理演算子が何を返すかという話をします。
var o = { a: 0 }; var b1 = o && o.a; var b2 = undefined && o; var b3 = o || ""; var b4 = null || undefined
値の論理値への変換
JavaScriptの値は、すべて論理値に変換可能できます。 次の値は全てfalseに変換されます。
- undefined
- null
- 0
- -0
- NaN
- ""
上記以外の値は、すべてtrueに変換されるので、次の式はtrueに変換されることになります。
{ a: 0 }
&&演算子と||演算子
&&演算子は次のような処理を行う。 1. 左の被演算子が「falseに評価されるもの」であれば、それを返す。 2. 左の被演算子が「trueに評価されるもの」であれば、右の被演算子を返す。
||演算子は次のような処理を行う。 1. 左の被演算子が「trueに評価されるもの」であれば、それを返す。 2. 左の被演算子が「falseに評価されるもの」であれば、右の被演算子を返す。
ですので、この記事の冒頭で示した論理演算子の評価値は次のようになります。
var o = { a: 0 }; var b1 = o && o.a; // 0 var b2 = undefined && o; // undefined var b3 = o || ""; // { a: 0 } var b4 = undefined || null; // null
面白いと思うのは、trueやfalseを返すということではないということです。 これを用いると引数がnullやundefinedのときのデフォルト値を設定することができます。
function foo(x) { // xがfalseと評価されるものであれば、xは{a: 0}となる var x = x || { a: 0 }; // ... }
ただ、このxにtrueかfalseが入っているようにも見えるので、初心者はハマるかもなぁという感想です。
ほぼすべてサイ本の内容そのままという感じですが、自分でまとめると ちゃんとわかっているかの確認になってよいなという感じです。 今後もまたサイ本を読んで気になった箇所の記事を書きたいと思います。