以下のコードを見てください。
let foo = "foo";
if (foo) console.log("bar"); // => "bar"
foo = null;
if (foo) console.log("bar"); // => 出力なし
foo = "foo";
console.log(foo && foo.length === 3); // => true
foo = null;
console.log(foo && foo.length === 3); // => null
最後の行は false を期待していたのですが、null が表示されます。
どういうことか
論理演算子 - JavaScript | MDN より引用:
しかし、&& および || 演算子は、実際には、指定された演算対象の一方を返します。ですから、それらの演算子が、真偽値ではない値とともに用いられた場合、真偽値ではない値を返す可能性があります。
なるほど。つまり、null && null.length === 3 は、null が false とみなされて右側は評価されず、しかし実際には false ではなくその値自体を返すため null が返される、ということです。
期待通りに動かすには
以下のようにします。
console.log(foo !== null && foo.length === 3);
まとめ
if (foo) {} とか foo && foo.length とかは使わずに、比較演算子を用いて厳密に比較しましょう。falsy な値は null や undefined だけではなく、"" や NaN なども
当てはまります。特に "" は比較演算子を用いて評価しないと予期せぬ動作になるケースが多そうです。