如何在JavaScript中评估三元运算符?

时间:2011-02-23 21:24:27

标签: javascript ternary-operator

关于JavaScript中的三元(? :)运算符,我想知道它是如何通过典型浏览器的JavaScript解释器进行评估的:

备选方案A:

  1. 评估第一个操作数。
  2. 如果第一个操作数的结果为true,则计算并返回第二个操作数。
  3. 否则,评估并返回第三个操作数。
  4. 备选方案B:

    1. 评估所有三个操作数。
    2. 如果第一个操作数的结果为true,则返回第二个操作数的结果。
    3. 否则,返回第三个操作数的结果。
    4. 备选方案C:

      当然,如果替代A和替代B都没有准确描述三元运算符的工作原理,请解释它是如何工作的。

4 个答案:

答案 0 :(得分:10)

According to the specification它的作用类似于备选方案

  

生产ConditionalExpression : LogicalORExpression ? AssignmentExpression : AssignmentExpression的评估如下:

     
      
  1. lref 成为评估LogicalORExpression的结果。
  2.   
  3. 如果ToBoolean(GetValue(lref)) true ,那么   
        
    • trueRef 成为评估第一个AssignmentExpression的结果。
    •   
    • 返回GetValue(trueRef)
    •   
  4.   
  5. 否则   
        
    • falseRef 成为评估第二个AssignmentExpression的结果。
    •   
    • 返回GetValue(falseRef)
    •   
  6.   

答案 1 :(得分:6)

“替代A”:

(1)? functionOne(): functionTwo()

如果您在两个函数上都添加了一条简单的警报消息,则只有functionOne会显示其消息。

function functionOne(){ 
   alert("one");
}
function functionTwo(){ 
   alert("two");
}

答案 2 :(得分:3)

三元运算符由于多种原因而懒惰地评估。

  1. 当你只返回if或else时,评估所有操作数是没有效率的
  2. 执行延迟评估可以让您执行x != 0 ? 10 / x : 10;之类的操作如果它同时评估所有内容,如果x为零,则会得到除以零错误

答案 3 :(得分:2)

运行此并找出:

function bool() {
    alert('bool');
    return false;
}

function a() {
    alert('a');
    return 'A';
}

function b() {
    alert('b');
    return 'B';
}

alert(bool() ? a() : b())