如何在JavaScript中计算三元运算符?

如何在JavaScript中计算三元运算符?,javascript,ternary-operator,Javascript,Ternary Operator,关于JavaScript中的三元(?:)运算符,我想知道典型浏览器的JavaScript解释器是如何评估它的: 备选案文A: (1)? functionOne(): functionTwo() 计算第一个操作数 如果第一个操作数的结果为真,则计算并返回第二个操作数 否则,计算并返回第三个操作数 备选案文B: 对所有三个操作数进行求值 如果第一个操作数的结果为真,则返回第二个操作数的结果 否则,返回第三个操作数的结果 备选案文C: 当然,如果备选方案A和备选方案B都不能准确描述三元运算符的工作原

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

备选案文A:

(1)? functionOne(): functionTwo()
  • 计算第一个操作数
  • 如果第一个操作数的结果为真,则计算并返回第二个操作数
  • 否则,计算并返回第三个操作数
  • 备选案文B:

  • 对所有三个操作数进行求值
  • 如果第一个操作数的结果为真,则返回第二个操作数的结果
  • 否则,返回第三个操作数的结果
  • 备选案文C:

    当然,如果备选方案A和备选方案B都不能准确描述三元运算符的工作原理,请解释它是如何工作的。

    它的工作原理与备选方案A类似:

    (1)? functionOne(): functionTwo()
    
    生产<代码>条件表达式:逻辑表达式?AssignmentExpression:AssignmentExpression的计算如下:

  • lref
    作为计算
    LogicalORExpression
    的结果
  • 如果
    ToBoolean(GetValue(lref))
    true
    ,则
    • trueRef
      作为计算第一个
      AssignmentExpression
      的结果
    • 返回
      GetValue(trueRef)
  • 否则
    • falseRef
      作为计算第二个
      赋值表达式的结果
    • 返回
      GetValue(falseRef)
  • “备选方案A”:

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

    function functionOne(){ 
       alert("one");
    }
    function functionTwo(){ 
       alert("two");
    }
    
    运行此命令并查找:

    function bool() {
        alert('bool');
        return false;
    }
    
    function a() {
        alert('a');
        return 'A';
    }
    
    function b() {
        alert('b');
        return 'B';
    }
    
    alert(bool() ? a() : b())
    

    三元运算符由于几个原因而延迟求值

  • 当只返回if或else时,计算所有操作数的效率很低
  • 执行惰性评估允许您执行类似
    x!=0 ? 10/x:10如果它同时计算所有内容,那么如果x为零,则会得到一个被零除的错误

  • “备选方案A”:
    (1)?functionOne():functionTwo()
    ,如果在两个函数上都放置一条简单的警报消息,则只有
    functionOne
    会显示其消息。噢,哇。谢谢将其作为答案发布,以便我可以接受。你可以比其他人的回复更快地测试它。我无法在IE6、IE7和IE8上测试它。抱歉,随机更正:JS中没有零除错误<代码>1/0==无穷大