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"
関連リンク