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

时间:2016-11-04 00:34:12

标签: javascript ternary-operator short-circuiting

最近遇到了短路评估,并且因为我在过去一周才进入编程而感到有些困惑。根据我的理解,如果在第一个双管道之前发生的事情是真的那么它将停止并且不评估在双管道之后发生的事情。例如:

示例1:

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

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

示例2:

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

为什么一个人使用示例1而不是示例2,因为它写出来的速度不是很慢,或者使用一个比另一个更快?或者这只是一个愚蠢的问题,也许我错过了一些东西。如果有人能为我清楚这一点,那就太好了。

2 个答案:

答案 0 :(得分:2)

短路操作符有多种方法会影响正确性和性能。

关键是避免第二个操作数的副作用或性能命中。

短路可以通过仅在安全时评估第二个操作数来避免错误:

var a = a && someFunctionThatWillThrowIfAIsNull(a);

如果更快的函数结果可以使第二个操作数变为冗余,则可以通过将其放在第二个来避免慢速函数:

var a = someFastFunction() || someSlowFunction();

答案 1 :(得分:0)

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

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