potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

JavaScript &&と||はfalsyまたはtrulyを返す(false/trueとは限らない)

JavaScript&&||C/C++&&||と微妙に異なる動作をします。

  • 類似点:左から右へ順次評価する。評価が左側で終われば右側は評価されない。
  • 相違点:結果は最後に評価した値そのもの(C/C++ではtrue/false)。

類似点は次のコードで確認できます。&&では最初のlog_and_return(false)がfalsy(ここではfalse)なので最初のlog_and_return(false)だけ評価されます。||では最初と次のlog_and_return(false)がfalsyなので順次評価され、最後のtrueも評価されます。

function log_and_return(x)
{
    console.log(`log_and_return(${x})`);
    return x;
}

console.log("a");
let a = log_and_return(false) && log_and_return(false) && true;
//>a
//>log_and_return(false)
// a = false

console.log("b");
let b = log_and_return(false) || log_and_return(false) || true;
//>b
//>log_and_return(false)
//>log_and_return(false)
// b = true

相違点は次のコードで確認できます。"truly"より前の値はfalsyなので&&は最初のfalsyである""||"truly"を返します。

console.log("" && false && 0 && -0 && 0n && null && undefined && NaN && "truly") // ""
console.log("" || false || 0 || -0 || 0n || null || undefined || NaN || "truly") // "truly"

関連リンク