是的,它是有效的,并且在 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 在评论中是正确的,当他/她说它看起来像是缩小的结果时。
的逗号操作者是一个二进制运算符(操作者接受两个操作数)。它评估它的左侧操作数(从而导致它具有的任何副作用,例如赋值),将该结果扔掉,然后评估它的右侧操作数(从而导致它的副作用,如果有的话)并将该结果作为它的结果值。如果一行中有多个逗号运算符,则整个表达式按从左到右的顺序计算,最终结果是最右侧操作数计算的结果。
当然,您知道条件运算符(三元运算符 - 一个接受三个操作数)用于根据初始表达式从两个子表达式中选择一个进行求值。
所以那条线非常......富有表现力......里面总共有七个*不同的表达方式。
因此,在该示例中,如果a !== b
最初或1
如果a === b
最初具有设置a
和的副作用,则整个表达式的结果为 2 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;
}
但是,哇,我希望这已经过压缩,因为如果一个人写的,他们必须真的有人得罪谁的后面应该保持它的事情... ;-)