繁体   English   中英

Javascript:为什么不(p + 1)++工作?

[英]Javascript: Why doesn't (p+1)++ work?

关于

p = 0;
(p+1)++;
> ReferenceError: Invalid left-hand side expression in postfix operation

p = 0;
++(p+4);
> ReferenceError: Invalid left-hand side expression in prefix operation

我只是有点意外,因为我期望postfix / prefix运算符可以处理表达式的分辨率(括号具有最高的运算符优先级)。

有人可以给我一两行来解释这里发生的事情吗?

谢谢

编辑:感谢您的快速回复,第一个答案标记为答案。 我觉得我也应该下面的@thefourtheye那里得到深刻的回答

++增加变量的值,因此它比以前更大。 例如:

var x = 3;
x++;
alert(x); // will show 4

对于这一点, ++的左边的表达式必须是可访问和可变的,否则增量是可能的。 例如:

3++

没有任何意义,因为3是一个常数,不能递增。 我们不希望这是可能的:

3++;
alert(3); // outputs 4???

这就是你的表达不起作用的原因。 即:

var p = 2;
(p + 1)++;

有与上面相同的问题。 (p + 1)将评估为3,而++不能改变常数3的值。

您正在尝试递增()increment/decrement运算符可以应用于变量,请尝试示例代码

(p++) + 1

要么

(++p) + 1

请记住,当你编写p++ ,它实际上被转换为p = p + 1 运算符++--是用于递增/递减变量以供将来使用的便捷符号。 但是(p+1)++++(p+4)应该如何被翻译? 那种暗示14正在增加/减少以供将来使用,这是没有意义的。

当你有这样的表达式

(expr)++;

这些是JavaScript将在内部执行的操作

  1. 解析expr引用的实际对象。

    这一步很重要,因为你甚至可以做这样的事情

     var a = {b: 1}; ++ab; a.b++; console.log(ab); # 3 

    现在,JavaScript必须解析要递增的实际对象。 在这种情况下,这将是b中的a

  2. 获取引用的值并将该值转换为数字。

    此步骤也非常重要,因为您甚至可能拥有这样的值

     var a = {b: '1'}; console.log(++ab); # 2 

    JavaScript将尽力获取数值,而不是立即失败。

  3. 增加数量。

  4. 将新的vale存储在expr 这是表达式失败的步骤。

    在你的情况下, exprp + 1 ,当它被解析时,值只是一个数字,其值永远不会改变。 (你永远不能将1的值更改为其他内容)。 因此,在递增部分之后,当必须存储新值时,JavaScript找不到存储它的有效引用。 这就是它抛出这个错误的原因。

    ReferenceError:后缀操作中的左侧表达式无效

实际上从内部PutValue方法抛出此错误消息。 第一步是这样的

 If Type(V) is not Reference, throw a ReferenceError exception. 

参考: ECMA Script 5.1 Prefix Increment Operator标准规范

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM