布林運算子中的短路
如果操作的結果不隨著額外的工作而改變,則和運算子(&&
)和或運算子(||
)採用短路來防止不必要的工作。
在 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
。