使用三元运算符或仅短路评估之间的区别?

bil*_*red 5 javascript ternary-operator short-circuiting

最近遇到了短路评估,并且对此感到有点困惑,因为我上周才开始编程。据我了解,如果第一个双管之前发生的事情是真的,那么它将停止并且不评估双管之后发生的事情。例如:

示例1:

var a = true;
var b = a || {};
Run Code Online (Sandbox Code Playgroud)

所以我假设如果 a 存在,则将 a 分配给 b 否则 b 等于一个对象。我不明白的是我将在哪里使用它以及它与三元运算符有何不同,短路评估是否与以下相同:

示例2:

var a = true;
var b = (a) ? a : {};
Run Code Online (Sandbox Code Playgroud)

为什么要使用示例 1 而不是示例 2,因为它的写出速度并没有变慢,或者使用其中一种比另一种有速度优势吗?或者这只是一个愚蠢的问题,也许我错过了一些东西。如果有人能为我解决这个问题那就太好了。

Erg*_*wun 7

您的两个示例都将导致被分配( )b的值,并且两个构造都避免对最终操作数(在每种情况下)的求值。atrue{}

但在可读性和评价上存在差异。

可读性:

我认为这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() || {};
    
Run Code Online (Sandbox Code Playgroud)

更一般地说,短路运算符可以帮助您:

  • 通过仅在安全时评估第二个操作数来避免错误:
    var a = a && someFunctionThatWillThrowIfAIsNull(a);
Run Code Online (Sandbox Code Playgroud)
  • 通过将函数作为第二个操作数来避免在某些条件下运行缓慢的函数:
    // Slower
    var a = someSlowFunction() || someFastFunction();
    
    // Faster
    var a = someFastFunction() || someSlowFunction();
Run Code Online (Sandbox Code Playgroud)