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

问题描述 投票:0回答:2

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

示例1:

var a = true;
var b = a || {};

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

示例2:

var a = true;
var b = (a) ? a : {};

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

javascript ternary-operator short-circuiting
2个回答
6
投票

您的两个示例都会导致

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();

1
投票

这里是不同用法的示例(取决于第一个参数)。检查每个控制台以了解它们的工作方式。

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("[] && {}:", [] && {});

© www.soinside.com 2019 - 2024. All rights reserved.