布尔运算符中的短路
如果操作的结果不随着额外的工作而改变,则和运算符(&&
)和或运算符(||
)采用短路来防止不必要的工作。
在 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
。