这是有效的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
答案 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)
答案 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;