Javascript - 多语句的三元运算符

IT技术 javascript
2021-02-20 01:04:22

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

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

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

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

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

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

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

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


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

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

使用实际语句重新编辑,该语句也有效:

但是,哇,我希望这已经过压缩,因为如果一个人写的,他们必须真的有人得罪谁的后面应该保持它的事情... ;-)

@Jamietre - 是的,你说得对。我将其归因于开发人员是一个非常科学的类型。哈哈。:)
2021-05-01 01:04:22
我用指示错误的实际语句更新了问题。
2021-05-05 01:04:22
嗯……那肯定有另一个错误来源。该代码充满了三元操作,其中包含额外的三元操作、单字母变量等。真是一团糟。谢谢。
2021-05-10 01:04:22
@Steve 听起来您正在查看的代码已被缩小,或者可能被缩小然后重新格式化。大多数人在编程(或单字母变量)时不会使用这样的构造,但这些是来自缩小过程的常见空间节省优化。
2021-05-17 01:04:22

是的:

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

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

或者你可以这样做:

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

在此处阅读有关逗号运算符的信息。

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

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

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

如果您不想使用逗号运算符 (,),则可以改用嵌套的条件(三元)运算符

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