今天我注意到 JavaScript 在某些條件下會忽略某些行的執行。
例如,正常人會閱讀以下代碼并認為value is false應該記錄 5 次。
const values = [false, false, false, false, false];
const isTrue = (value) => {
console.log(`value is ${value}`);
return !!value;
};
let isAllTrue = true;
values.forEach(value => {
isAllTrue &&= isTrue(value);
});
但是,這段代碼記錄了一次。
這段代碼表明,無論你做什么,一旦isAllTrue是false,isAllTrue永遠不會是true由于&&=。這就是為什么我認為函式執行被忽略的原因。我認為這是 JavaScript 的優化。
我想知道確切的原因,所以我用谷歌搜索,但我找不到規范。如果您知道規格在哪里,請告訴我。
uj5u.com熱心網友回復:
您正在目睹短路評估。
首先,讓我們拆開包裝isAllTrue &&= isTrue(value),讓它更清楚一點。如果我們以更長的形式撰寫此陳述句,它將是isAllTrue = isAllTrue && isTrue(value).
在第一次迭代之后,isAllTruewill false,所以無論isTrue(value)回傳什么, 的結果都isAllTrue && isTrue(value)將是false。由于無需求值就知道結果isTrue(value),JavaScript 將其優化掉,甚至不呼叫它。
uj5u.com熱心網友回復:
來自&&- LOGICAL AND的檔案:
當且僅當所有運算元為真時,一組布爾運算元的邏輯 AND (&&) 運算子(邏輯與)才會為真。否則會是假的。
更一般地,運算子回傳從左到右求值時遇到的第一個假運算元的值,如果它們都是真,則回傳最后一個運算元的值。
這基本上意味著之前的第一個運算式&&是否為假。第二個甚至從未達到。這不是 JS 的優化。這就是運算子在編碼語言中的作業方式。這正是您的代碼發生的情況。該函式只運行一次。一旦 isAllTrue 的值為false. 它永遠不會成為true再
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/395637.html
標籤:javascript 优化
