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
我只是有点惊讶,因为我预计后缀/前缀运算符可以解决表达式的分辨率(括号具有最高的运算符优先级)。
有人可以给我一三行来解释这里发生的事情吗?
谢谢
编辑:感谢您的快速回复,第一个答案标记为答案。我觉得我还应该向人们指出下面@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}; ++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 找不到有效的引用来存储它。这就是它引发此错误的原因。引用错误:后缀操作中的左侧表达式无效
此错误消息实际上是从内部PutValue
方法引发的。第一步是这样的
If Type(V) is not Reference, throw a ReferenceError exception.
参考:ECMA 脚本 5.1 Prefix Increment Operator
标准规范
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 监视函数从服务返回不起作用,但作用域函数起作用
- 幻灯片滚动javascript不起作用
- 简单的javascript在Shopify中不起作用
- Recaptcha在IE7和IE8中不起作用
- Ember Data DS.Model's set函数不起作用
- JsFiddle上的鼠标事件不起作用
- 我的AngularJS表达式没有'不起作用
- 点击按钮输入不起作用
- 面向对象的Javascript代码在IE7中不起作用
- 分部隐藏在jquery中不起作用
- 在phonegap应用程序内部重定向不起作用
- Array.length似乎不起作用;console.log则显示其他情况
- $ionicplatform内的$scope不;不起作用
- 我的javascript for循环不起作用
- Meteor-添加用户自定义字段的方法不起作用
- 为什么 .focus() 不起作用,而 .css(“color”,“red”) 在同一个选择器上起作用
- Textarea必需的attribut在javascript中不起作用
- 为什么javascript:void(0)在Firefox中不起作用
- 退出全屏不起作用