布林運算子中的短路

如果操作的結果不隨著額外的工作而改變,則和運算子(&&)和或運算子(||)採用短路來防止不必要的工作。

x && y 中,如果 x 評估為 false,則不會評估 y,因為整個表示式保證為 false

x || y 中,如果 x 評估為 true,則不會評估 y,因為整個表示式保證為 true

功能示例

採取以下兩個功能:

function T() { // True
  console.log("T");
  return true;
}

function F() { // False
  console.log("F");
  return false;
}

例 1

T() && F(); // false

輸出:

‘T’
‘F’

例 2

F() && T(); // false

輸出:

‘F’

例 3

T() || F(); // true

輸出:

‘T’

例 4

F() || T(); // true

輸出:

‘F’‘T
'

短路以防止錯誤

var obj; // object has value of undefined
if(obj.property){ }// TypeError: Cannot read property 'property' of undefined
if(obj.property && obj !== undefined){}// Line A TypeError: Cannot read property 'property' of undefined

A 行:如果顛倒順序,第一個條件語句將通過不執行它來防止第二個條件語句的錯誤,如果它會丟擲錯誤

if(obj !== undefined && obj.property){}; // no error thrown 

但是,只有在你期待 undefined 時才能使用

if(typeof obj === "object" && obj.property){}; // safe option but slower

短路以提供預設值

||運算子可用於選擇 truthy 值或預設值。

例如,這可用於確保將可空值轉換為不可為空的值:

var nullableObj = null;
var obj = nullableObj || {};  // this selects {}

var nullableObj2 = {x: 5};
var obj2 = nullableObj2 || {} // this selects {x: 5}

或者返回第一個真值

var truthyValue = {x: 10};
return truthyValue || {}; // will return {x: 10}

同樣可以用來多次退回:

envVariable || configValue || defaultConstValue // select the first "truthy" of these

短路呼叫可選功能

&& 運算子可用於評估回撥,只有在傳遞迴調時:

function myMethod(cb) {
    // This can be simplified
    if (cb) {
       cb();
    }

    // To this
    cb && cb();
}

當然,上面的測試並沒有證實 cb 實際上是 function 而不僅僅是 Object / Array / String / Number