优先级:逻辑或与三元运算符
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 < end)) ? 1 : -1
“更高优先级”意味着首先评估||
,即首先评估step || (start < end)
。
@NiettheDarkAbsol:这意味着三元具有更高的优先级,对吧? MDN 文档另有说明...
@Xufox:如果是这样,那么第三次调用将返回 2。它不会...
@Pineda No... step || (start < 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
,它的右操作数是false
。 false
永远不会被执行。
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语句, 逻辑运算符, 三元运算符, 指针与函数