布尔运算符中的短路

如果操作的结果不随着额外的工作而改变,则和运算符(&&)和或运算符(||)采用短路来防止不必要的工作。

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