java 条件赋值语句_java – 带条件和赋值运算符的表达式

以下是理解JavaScript条件表达式和Java条件表达式之间差异的两个关键:

请阅读ECMAScript 5注释规范本节底部的注释:

现在,请阅读条件表达式的Java规范部分:

您将注意到,正如ECMAScript 5注释所述,Java中三元运算符中的第三个操作数不能只是任何旧表达式 – 它只能是ConditionalExpression.但是,对于ECMAScript 5,第三个操作数可以是任何AssignmentExpression.

进一步看Java规范,我们看到Expression是任何赋值表达式:

但是ConditionalExpression要么是带有三元运算符的ConditionalExpression(……?…:…),要么只是一个ConditionalOrExression(在ES5中称为LogicalOrExpression)(请参阅上面前两个链接中的任意一个信息). ConditionalOrExpression可以在Java中从这里开始的“链”:

在ECMAScript 5中:

在ECMAScript 5规范中向后跟随表达式类型的“链”(因为它比Java规范更容易遵循)从ConditionalExpression开始,一直到基本上每个其他表达式,但是Assignment Expression最终将我们放在开头 – Primary Expression:

上面两个代码片段中的第二个操作数是一个主要表达式:

1

所有这些rigamarole(如果我是正确的)的结果是在Java中,三元运算符的第三个操作数不能是赋值,但在JavaScript中它可以.这就是为什么你的两个例子都在Java中失败但在JavaScript中只是第二个.

为什么第一个工作在JavaScript而不是第二个?

operand1 ? operand2 : operand3;

类似于以下IIFE代码(实际上不是,但下面的代码说明了上述工作原理):

(function () { if (operand0) return operand1; else return operand2;}());

所以:

false ? 1 : x = 2;

成为(再次,实际上不是 – 下面的代码说明了上面的代码):

(function () { if (false) return 1; else return x = 2;}());

但是,在第二个片段中,当使用parens时,您会明确地将条件表达式与’= 2;’分开:

(false ? 1 : x) = 2;

成为(再次,实际上不是 – 下面的代码说明了上面的代码):

(function () { if (false) return 1; else return x;}()) = 2;

三元运算符的“行为类似于示例IIFE函数调用”行为将返回x是什么,并且将是一个值,而不是一个无法分配的引用.因此错误.这将类似于以下代码(如果x === 3):

3 = 2;

显然,人们不能这样做.

在Java中,我相信,第一个给出错误,因为第三个操作符不能是赋值,第二个给出错误,因为你不能赋值(就像在JavaScript中一样).

至于操作符优先级,请查看以下代码:

var x = 3;

console.log(false ? 1 : x); // ?: evaluates to "3"

console.log(false ? 1 : x = 2); // ?: evaluates to "2"

console.log(false ? 1 : x = 2, 4); // ?: evaluates to "2" - "2" and "4" arguments passed to log

console.log((false ? 1 : x = 2, 4)); // ?: evaluates to "4"

当从上述IIFE说明性代码的角度来看时,前两个容易理解.

在第一行中,x被评估,条件表达式的计算结果为3 – 这很容易.

在第二行中,我可以描述它的最好方法是条件运算符(?:)导致甚至较低优先级’=’运算符被计算为完整表达式而不是因为(?:)具有更高的优先级,但是因为as规范声明评估’:’后面的赋值表达式(包括’= 2’部分)作为AssignmentExpression.在上面的IIFE示例的return语句中,此行为看起来更清晰.至少使用JavaScript,您不仅可以在第二个操作数中进行赋值,还可以在条件表达式的第三个中进行赋值.

但是,在第三行中,已经在“x = 2”表达式中找到了完整的赋值表达式,并且三元运算符将其用作完整的第三个操作数,并且’,’运算符的优先级低于任何其他运算符,我们得到相当于以下代码:

console.log((false ? 1 : x = 2), 4);

在第四行代码中,将整个表达式封装在parens中的console.log()语句中,将’,4’作为第三个操作数的一部分带入’?:’三元表达式.

以下jsfiddles使用实时代码演示了上述讨论.请注意,在打印“2”两次后,前两个具有相同的确切错误:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值