先追這段程式
mark 先記錄呼叫名稱,再傳回值。左邊分別是假和真,右邊會否執行?
const calls=[];
function mark(label,value){calls.push(label);return value;}
const a=mark('left-and',false)&&mark('right-and',true);
const b=mark('left-or',true)||mark('right-or',false);
console.log(JSON.stringify({a,b,calls}));
{"a":false,"b":true,"calls":["left-and","left-or"]}| 運算式 | 有執行的呼叫 | 傳回值 |
|---|---|---|
| false && right | left-and | false |
| true || right | left-or | true |
結果為何如此
&& 左邊是假值便直接傳回,|| 左邊是真值也直接傳回,所以右邊可被跳過。所得是運算元本身,不一定是布林值。每次都必須做的動作,應另寫明確語句。
比較另一種寫法
把必做收尾放在 false && 右邊,動作就被跳過。空字串也是假值,&& 會原樣傳回空字串。
const calls=[];const value=''&&calls.push('cleanup');
console.log(JSON.stringify({value,calls}));
{"value":"","calls":[]}試清邊界
左邊改成 true && 和 false ||,哪些右邊呼叫會跑?
查看參考答案
兩個右邊都會跑,各自在左邊之後;結果取各自右邊傳回的值。
const calls=[];function mark(label,value){calls.push(label);return value;}
const a=mark('left-and',true)&&mark('right-and',7);
const b=mark('left-or',false)||mark('right-or','ready');
console.log(JSON.stringify({a,b,calls}));
{"a":7,"b":"ready","calls":["left-and","right-and","left-or","right-or"]}