[英]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)
应该如何被翻译? 那种暗示1
或4
正在增加/减少以供将来使用,这是没有意义的。
当你有这样的表达式
(expr)++;
这些是JavaScript将在内部执行的操作
解析expr
引用的实际对象。
这一步很重要,因为你甚至可以做这样的事情
var a = {b: 1}; ++ab; a.b++; console.log(ab); # 3
现在,JavaScript必须解析要递增的实际对象。 在这种情况下,这将是b
中的a
。
获取引用的值并将该值转换为数字。
此步骤也非常重要,因为您甚至可能拥有这样的值
var a = {b: '1'}; console.log(++ab); # 2
JavaScript将尽力获取数值,而不是立即失败。
增加数量。
将新的vale存储在expr
。 这是表达式失败的步骤。
在你的情况下, expr
是p + 1
,当它被解析时,值只是一个数字,其值永远不会改变。 (你永远不能将1的值更改为其他内容)。 因此,在递增部分之后,当必须存储新值时,JavaScript找不到存储它的有效引用。 这就是它抛出这个错误的原因。
ReferenceError:后缀操作中的左侧表达式无效
实际上从内部PutValue
方法抛出此错误消息。 第一步是这样的
If Type(V) is not Reference, throw a ReferenceError exception.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.