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

时间:2017-02-03 14:09:30

标签: javascript ternary-operator operator-precedence logical-or

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

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

问题:   为什么||运算符在这种情况下不能得到捷径?

     

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

     

我是否误读了MDN docs for Operator precedence

2 个答案:

答案 0 :(得分:7)

是的,||运算符的优先级高于条件?:运算符。这意味着它首先被执行。从您链接的页面:

  

运算符优先级确定运算符的计算顺序。首先评估具有更高优先级的运算符。 (MDN)enter link description here

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

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

具有最高优先级的运算符是()分组操作。这导致false

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

下一个最高优先级是逻辑OR运算符。 step是真实的,因此导致step

step = step ? 1 : -1;

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

step = 1;

答案 1 :(得分:0)

JavaScript是松散类型的,这意味着只要运算符或语句需要特定的数据类型,JavaScript就会自动将数据转换为该类型。

让我们看看它如何转换为其他类型

示例1。

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

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

请记住,如果某个值是真实的,除非它已知是假的。

幸运的是,只有六个假 -

  1. false(当然!)
  2. 未定义
  3. 0(数字零)
  4. “”(空字符串)
  5. NaN(非数字)
  6. 示例2。

    var x = zoo ||明星;

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

    示例3。

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

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

    示例4。

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

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

    首先评估第一个('1'||(真))

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

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

    '1'不是真的,所以'2'将被退回

    最终结果:str ='2'

    示例5。

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

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

    首先评估第一个('1'||(false))

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

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

    '1'不是真的,所以'2'将被退回

    最终结果:str ='2'

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