跳至內容
Astera Technology

短路運算不只算真假,也會影響有沒有執行

不只估真假,還要核對哪些函式根本沒跑。

下載完整個案資料及參考答案 ↓

先追這段程式

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}));
確實的 console 輸出
{"a":false,"b":true,"calls":["left-and","left-or"]}
值與執行位置
運算式有執行的呼叫傳回值
false && rightleft-andfalse
true || rightleft-ortrue

結果為何如此

&& 左邊是假值便直接傳回,|| 左邊是真值也直接傳回,所以右邊可被跳過。所得是運算元本身,不一定是布林值。每次都必須做的動作,應另寫明確語句。

比較另一種寫法

把必做收尾放在 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"]}

原始例子檔案