关于
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运算符可以解决表达式的问题(括号具有最高的运算符优先级)。
有人可以给我一两行来解释这里发生的事情吗?
由于
编辑:感谢您的快速回复,第一个答案标记为答案。我觉得我也应该将人们指向下面的answer from @thefourtheye
答案 0 :(得分:10)
++
增加变量的值,因此它比以前更大。例如:
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的值。
答案 1 :(得分:6)
您正在尝试增加()
,increment/decrement
运算符可以应用于变量,请尝试示例代码
(p++) + 1
OR
(++p) + 1
答案 2 :(得分:3)
请记住,当您撰写p++
时,实际上会将其翻译为p = p + 1
。运算符++
和--
是用于递增/递减变量以供将来使用的便捷符号。但是(p+1)++
或++(p+4)
应该如何翻译?那种暗示1
或4
正在增加/减少以供将来使用,这是没有意义的。
答案 3 :(得分:2)
当你有这样的表达时
(expr)++;
这些是JavaScript将在内部执行的操作
解析expr
引用的实际对象。
这一步很重要,因为你甚至可以做这样的事情
var a = {b: 1};
++a.b;
a.b++;
console.log(a.b);
# 3
现在,JavaScript必须解析要递增的实际对象。在这种情况下,b
中的a
。
获取引用值并将该值转换为数字。
此步骤也非常重要,因为您甚至可能拥有这样的值
var a = {b: '1'};
console.log(++a.b);
# 2
JavaScript会尽力获取数字值,而不是立即失败。
增加数量。
将新值存储在expr
中。这是表达式失败的步骤。
在你的情况下expr
是p + 1
,当它被解析时,该值只是一个数字,其值永远不会改变。 (你永远不能将1的值更改为其他内容)。因此,在递增部分之后,当必须存储新值时,JavaScript没有找到存储它的有效引用。这就是它抛出这个错误的原因。
ReferenceError:后缀操作中的左侧表达式无效
此错误消息实际上是从内部PutValue
方法引发的。第一步是这样的
If Type(V) is not Reference, throw a ReferenceError exception.
参考:ECMA Script 5.1 Standard Specification for Prefix Increment Operator