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

时间:2014-04-02 06:07:12

标签: javascript

关于

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

4 个答案:

答案 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)应该如何翻译?那种暗示14正在增加/减少以供将来使用,这是没有意义的。

答案 3 :(得分:2)

当你有这样的表达时

(expr)++;

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

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

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

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

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

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

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

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

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

  3. 增加数量。

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

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

      

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

  5. 此错误消息实际上是从内部PutValue方法引发的。第一步是这样的

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

    参考:ECMA Script 5.1 Standard Specification for Prefix Increment Operator