Javascript:为什么 (p+1)++ 不起作用

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

本文关键字:不起作用 p+1 为什么 Javascript      更新时间:2023-09-26

关于

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

我只是有点惊讶,因为我预计后缀/前缀运算符可以解决表达式的分辨率(括号具有最高的运算符优先级)。

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

谢谢

编辑:感谢您的快速回复,第一个答案标记为答案。我觉得我还应该向人们指出下面@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};
    ++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 找不到有效的引用来存储它。这就是它引发此错误的原因。

    引用错误:后缀操作中的左侧表达式无效

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

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

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