优先级:逻辑或与三元运算符

Posted

技术标签:

【中文标题】优先级:逻辑或与三元运算符【英文标题】:Precedence: Logical or vs. Ternary operator 【发布时间】:2017-06-20 22:30:14 【问题描述】:

请考虑以下几点:(编辑:我稍微修改了函数以删除使用三元运算符的 use 或大括号)

function someFunction(start,end,step)
  var start = start || 1,
      end = end || 100,
      boolEndBigger = (start < end);   // define Boolean here
      step = step || boolEndBigger ? 1:-1;
  console.log(step); 


someFunction()
// step isn't defined so expect (1<10) ? 1:-1  to evaluate to 1

someFunction(1,10)  
// again step isn't defined so expect to log 1 as before

问题:

someFunction(1,10,2) 
//step IS defined, shortcut logical OR || should kick in, 
//step should return 2 BUT it returns 1

我知道这很容易通过使用大括号来解决:

function range(start,end,step)
  var start = start || 1,
      end = end || 100,
      step = step || ((start < end) ? 1:-1);
  console.log(step); 


问题: 在这种情况下,为什么|| 运算符没有捷径?

我知道逻辑或在二进制中的优先级最低 逻辑条件运算符,但认为它 具有更高的 优先级高于条件三元运算符?

我是否误读了MDN docs for Operator precedence?

【问题讨论】:

“更高的优先级”意味着您的代码被评估为(step || (start &lt; end)) ? 1 : -1 “更高优先级”意味着首先评估||,即首先评估step || (start &lt; end) @NiettheDarkAbsol:这意味着三元具有更高的优先级,对吧? MDN 文档另有说明... @Xufox:如果是这样,那么第三次调用将返回 2。它不会... @Pineda No... step || (start &lt; end) ? 1 : -1 评估为 step ? 1 : -1 因为首先评估 ||step 是真实的。然后,step ? 1 : -1 被评估为1,因为step 是真实的。 【参考方案1】:

是的,|| 运算符的优先级高于条件 ?: 运算符。这意味着它首先被执行。来自你link的页面:

运算符优先级决定了运算符的计算顺序。首先计算优先级较高的运算符。

让我们看看这里的所有操作:

step = step || (start < end) ? 1:-1;

优先级最高的运算符是() 分组运算。这里结果为false

step = step || false ? 1 : -1;

下一个最高优先级是逻辑或运算符。 step 是真实的,所以结果是 step

step = step ? 1 : -1;

现在我们进行三元运算,这是唯一剩下的一个。同样,step 是真的,所以第一个选项被执行。

step = 1;

【讨论】:

我明白了。我不明白为什么在这种情况下当左侧条件为真时|| 没有快捷方式? @Pineda 确实如此。它的左操作数是step,它的右操作数是falsefalse 永远不会被执行。 step = step || false ? 1 : -1;为什么false ? 1:-1会在这里被执行,是不是就相当于step = step || (false ? 1 : -1); 啊等等...我想我明白了,我的假设是:false ? 1 : -1 算作|| 的第二个条件,而不是 just @Pineda 是的,右侧 直到下一个运算符 是操作数,而不是右侧的所有内容。想想5 + 2 * 3 + 4 是如何执行的。 * 的优先级高于 +,因此首先执行 2*3【参考方案2】:

javascript 是松散类型的,这意味着每当一个运算符或语句需要特定的数据类型时,JavaScript 都会自动将数据转换为该类型。

让我们看看它如何转换为其他类型的一些场景

示例 1.

if() 语句需要一个布尔值, 因此,您在括号中定义的任何内容都将转换为布尔值。

根据这种转换的结果(即真或假),JavaScript 值通常被称为“真”或“假”。

记住一个值是否为真,除非已知它是假的。

还好只有六个假的——

    假(当然!) 未定义 空 0(数字零) “”(空字符串) NaN(非数字)

示例 2。

var x = 动物园 ||星;

如果 zoo 的值为 true,则返回 zoo 的值,否则返回 star 的值

示例 3。

var str = '1' || '2';

'1' 不是假的,所以会返回 '1' 结果:str = '1';

示例 4。

var str = '1' || (true) ? '2' : '3';

||(逻辑或)运算符的优先级首先大于?(条件) 运营商

所以首先 ( '1' || (true) ) 将首先被评估

'1' 不是假的,所以会返回 '1'

中间结果:str = '1' ?' 2' : '3'

'1' 不真实,因此将返回 '2'

最终结果:str = '2'

示例 5。

var str = '1' || (false) ? '2' : '3';

||(逻辑或)运算符的优先级首先大于?(条件) 运营商

所以首先 ( '1' || (false) ) 将首先被评估

'1' 不是假的,所以会返回 '1'

中间结果:str = '1' ?' 2' : '3'

'1' 不真实,因此将返回 '2'

最终结果:str = '2'

现在很容易在你的场景中弄清楚:)

【讨论】:

以上是关于优先级:逻辑或与三元运算符的主要内容,如果未能解决你的问题,请参考以下文章

C-switch语句, 逻辑运算符, 三元运算符, 指针与函数

零基础 快速学Java韩顺平 p62-80 运算符:算数关系逻辑赋值三元和优先级

Javascript 三元运算符的运算符优先级

三元条件和赋值运算符优先级

JavaScript-运算符

变量的三元运算符分配优先级