Javascript - 具有多个语句的三元运算符

时间:2011-07-13 11:53:11

标签: javascript

这是有效的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

5 个答案:

答案 0 :(得分:30)

是的,它有效,并且在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在评论中是正确的,当他/她说它看起来像是缩小的结果。

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

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

所以这条线非常......富有表现力......总共有七个 *不同的表达式。

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

在我看来,这是副作用,这是一个值得怀疑的选择。当然,如果左侧操作数没有有副作用,则没有理由使用逗号运算符。


*是的,七个包含在整体三元​​组中:

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

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

答案 1 :(得分:23)

是:

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

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

答案 2 :(得分:2)

或者你可以这样做:

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

阅读有关逗号运算符的here

  

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

答案 3 :(得分:1)

如果您不想使用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);

答案 4 :(得分:0)

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

嵌套意味着存在分支逻辑,尽管它在逻辑上是嵌套的,但是编写嵌套的IF会使我们在示例中所做的事情变得复杂。就像律师向陪审团解释问题一样。 IMO,您想用最简单的形式解释要点。例如,我发现此示例是表示执行TRUE的嵌套ifs的最合逻辑的方式。最后的错误是您的其他错误{} 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;