【问题标题】:Javascript - Ternary Operator with Multiple StatementsJavascript - 具有多个语句的三元运算符
【发布时间】:2011-07-13 11:53:11
【问题描述】:

这是有效的 JavaScript 吗?我看到一个例子,有人在三元运算符条件中使用逗号,它在我的编辑器中被标记为错误,并且该示例没有在 Chrome 中运行。但是,它确实在 Firefox 中运行。一旦我将所有三元语句转换为 if/else 语句,该应用程序就会在 Chrome 上运行。

a!==b ? (a=1, b=2) : (a=2, b=1)

编辑:

这是代码中的实际语句:

a!==0?b<0?(h=b/a,e=h-1,f=-2*b+2*a*e,i=-2*b+2*a*h,d=2*h*a-2*b-2*a):(h=b/a,e=h+1,f=2*b-2*a*e,i=2*b-2*a*h,d=-2*h*a+2*b):d=h=e=f=i=0

【问题讨论】:

    标签: javascript


    【解决方案1】:

    是的,它是有效的,并且在 Chrome 中运行良好:

    var a, b, c;
    
    a = 6;
    b = 7;
    c = a !== b ? (a = 1, b = 2) : (a = 2, b = 1);
    console.log("a = " + a);
    console.log("b = " + b);
    console.log("c = " + c);

    我并不是说在代码中这是一个远程的好主意人类是为了阅读。 :-) 当他/她说它看起来像是缩小的结果时,我希望 jamietre 在 cmets 中是正确的。

    comma operator 是二元运算符(接受两个操作数的运算符)。它评估其左侧操作数(从而导致其具有的任何副作用,例如赋值),丢弃该结果,然后评估其右侧操作数(从而导致其副作用,如果有的话)并将该结果作为它的结果值。如果一行中有多个逗号运算符,则整个表达式按从左到右的顺序计算,最终结果是最右边的操作数计算得到的值。

    当然,您知道条件运算符(三元运算符 - 一个接受三个操作数)用于根据初始表达式选择两个子表达式之一进行计算。

    所以那行非常...富有表现力...里面总共有七个*不同的表达方式。

    因此,在该示例中,如果初始为 a !== b,则整体表达式的结果为 2,如果初始为 a === b,则为 1,具有设置 ab 的副作用。

    在我看来,它的副作用使它成为一个值得商榷的选择。当然,如果左侧操作数 没有 有副作用,则没有理由使用逗号运算符。


    * 是的,有 7 个 被打包到整个三元组中:

    • a !== b
    • 第一个逗号表达式
    • a = 1
    • b = 2
    • 第二个逗号表达式
    • a = 2
    • b = 1

    使用实际语句重新编辑您的编辑,该语句也可以:

    function test(a) {
        var b = 7,
            d = 1,
            e = 2,
            f = 3,
            g = 4,
            h = 5,
            i = 6;
        
        a!==0?b<0?(h=b/a,e=h-1,f=-2*b+2*a*e,i=-2*b+2*a*h,d=2*h*a-2*b-2*a):(h=b/a,e=h+1,f=2*b-2*a*e,i=2*b-2*a*h,d=-2*h*a+2*b):d=h=e=f=i=0;
        
        console.log("a = " + a);
        console.log("b = " + b);
        console.log("d = " + d);
        console.log("e = " + e);
        console.log("f = " + f);
        console.log("g = " + g);
        console.log("h = " + h);
        console.log("i = " + i);
    }
    
    test(0);
    test(1);
    .as-console-wrapper {
      max-height: 100% !important;
    }

    但是哇,我希望这被缩小了,因为如果一个人写了那个,他们必须真的对任何应该在以后维护它的人有意见...... ;-)

    【讨论】:

    • 嗯...那么肯定有另一个错误来源。代码中充满了三元运算,其中还有额外的三元运算、单字母变量等。真是一团糟。谢谢。
    • @Steve 听起来您正在查看的代码已被缩小,或者可能被缩小然后重新格式化。大多数人在编程时不使用这样的结构(或单字母 var),但这些是来自 minfication 过程的常见的节省空间的优化。
    • 我用指示错误的实际语句更新了问题。
    • @Jamietre - 是的,你是对的。我将其归因于开发人员是一个非常科学的类型。哈哈。 :)
    【解决方案2】:

    是的:

    a=1;
    b=2;
    
    a!==b ? (a=1, b=2) : (a=2, b=1)
    
    console.log(a);     // 1
    console.log(b);     // 2
    

    和:

    a=1;
    b=2;
    
    a===b ? (a=1, b=2) : (a=2, b=1)
    
    console.log(a);     // 2
    console.log(b);     // 1
    

    您可以分析,如果您查看结果,更改等式运算符对我们的测试做出正确反应。

    【讨论】:

      【解决方案3】:

      或者你可以这样做:

      b = a!==b ? (a=1,2) : (a=2,1);
      

      阅读here 了解逗号运算符。

      逗号运算符计算其每个操作数(从左到右)并返回最后一个操作数的值。

      【讨论】:

        【解决方案4】:

        使用 ES6 代码示例扩展此主题。如果您使用 TRUE : FALSE 参数的一侧来遍历一个 IF 中的所有情况,则将代码分开是有意义的,就好像它是一个开关 |案例陈述。

        嵌套意味着存在分支逻辑,虽然它在逻辑上是嵌套的,但编写嵌套的 IF 会使我们在我的示例中所做的事情变得复杂。就像律师过度向陪审团解释问题一样。 IMO,您想以最简单的形式解释这一点。例如,我发现这个例子是表达执行 TRUE 的嵌套 if 的最合乎逻辑的方式。最后的 false 是你最后的 else {} choreDoor 是 0,1 或 2:

        choreDoor === 0 ? 
           (openDoor1 = botDoorPath,
            openDoor2 = beachDoorPath,
            openDoor3 = spaceDoorPath)
        : choreDoor === 1 ? 
           (openDoor2 = botDoorPath,
            openDoor1 = beachDoorPath, 
            openDoor3 = spaceDoorPath) 
        : choreDoor === 2 ?
           (openDoor3 = botDoorPath,
            openDoor1 = beachDoorPath, 
            openDoor2 = spaceDoorPath)
        : false;
        

        【讨论】:

          【解决方案5】:

          如果您不想使用Comma operator (,),则可以使用嵌套的Conditional (ternary) operators

          var a = 6;
          var b = 7;
          var c = (a !== b)?  // true
                  ((a = 1 || 1===1)? (b = 2) : null) // will first run a=1, then b=2
                : ((a = 0 || 1===1)? (b = 0) : null);
          
          console.log("a = " + a);
          console.log("b = " + b);
          console.log("c = " + c);

          【讨论】:

            猜你喜欢
            • 2013-02-13
            • 1970-01-01
            • 1970-01-01
            • 2019-12-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多