最近遇到了短路评估,并对此感到有点困惑,因为我上周才开始编程。据我了解,如果第一个双管之前发生的事情是真的,那么它将停止并且不评估双管之后发生的事情。例如:
示例1:
var a = true;
var b = a || {};
所以我假设如果a存在,则将a分配给b,否则b等于一个对象。 我不明白的是我将在哪里使用它以及它与三元运算符有何不同,短路评估是否与以下相同:
示例2:
var a = true;
var b = (a) ? a : {};
为什么要使用示例 1 而不是示例 2,因为它的写出速度并没有变慢,或者使用其中之一比使用另一个有速度优势吗?或者这只是一个愚蠢的问题,也许我错过了一些东西。如果有人能为我解决这个问题那就太好了。
您的两个示例都会导致
b
被分配为 a
(true
) 的值,并且两个构造都避免了对最终操作数的求值(在每种情况下都是 {}
)。
但是,可读性和评价上存在差异。
可读性:
我认为
if (a || b) { ... }
比 if (a ? a : b) { ... }
更具可读性)。
操作数评估:
在
(a || b)
中,a
仅评估一次。在 (a ? a : b)
中,a
被评估两次。当您使用函数或其他表达式而不是简单变量时,这一点变得很重要:
// Costly double evaluation
var a = someExpensiveFunction()
? someExpensiveFunction()
: {};
// Less costly single evaluation
var a = someExpensiveFunction() || {};
更一般地说,短路操作员可以帮助您:
var a = a && someFunctionThatWillThrowIfAIsNull(a);
// Slower
var a = someSlowFunction() || someFastFunction();
// Faster
var a = someFastFunction() || someSlowFunction();
这里是不同用法的示例(取决于第一个参数)。检查每个控制台以了解它们的工作方式。
console.log("'' || {}:", '' || {});
console.log("1 || {}:", 1 || {});
console.log("0 || {}:", 0 || {});
console.log("true || {}:", true || {});
console.log("false || {}:", false || {});
console.log("[] || {}:", [] || {});
console.log('');
console.log("('') ? '' : {}:", ('') ? '' : {});
console.log("(1) ? 1 : {}:", (1) ? 1 : {});
console.log("(0) ? 0 : {}:", (0) ? 0 : {});
console.log("(true) ? true : {}:", (true) ? true : {});
console.log("(false) ? false : {}:", (false) ? false : {});
console.log("([]) ? [] : {}:", ([]) ? [] : {});
console.log('');
console.log("'' && {}:", '' && {});
console.log("1 && {}:", 1 && {});
console.log("0 && {}:", 0 && {});
console.log("true && {}:", true && {});
console.log("false && {}:", false && {});
console.log("[] && {}:", [] && {});