百科问答小站 logo
百科问答小站 font logo



js中一元表达式问题(++和--)? 第1页

  

user avatar   chuguixin 网友的相关建议: 
      

我来尝试回答一下楼主的疑问吧。

首先,总结一下楼主的意思是:从规范的语法上看一元运算符前缀无限多个,可是为什么1+ + + + +2可以执行,而++3或者++ ++a又或者--a--等就会报错呢?如果是,那我觉得

@winter

可能误会你的疑问了;如果不是,那就折叠我吧。

然后,我核心的答案是:

ECMAScript Language Specification

的语法上看,UnaryExpression可以是PostfixExpression也可以是operator+UnaryExpression,所以推论出“一元表达式可以作为前缀无限多个”(楼主是想说“一元操作符可以作为前缀无限多个”),貌似比较合理。但是,如果我们详细看每一个operator就会发现不同的operator有不同的执行过程。比如+,我们看“UnaryExpression :+ UnaryExpression”产生式的执行过程非常简单,就是一个ToNumber(GetValue(expr)),在我们正常使用的情况下会按照

Annotated ES5

得到一个数字(值,非引用),所以再次对一个值进行+操作的时候,无论是ToNumber还是GetValue都是不会有异常的;而我们去看一下++(Prefix Increment Operator,它就复杂一些了,与我们本次讨论息息相关的是第1、5和6步,首先第一次使用++,通过6步(Return newValue)并追溯newValue(newValue源于ToNumber(GetValue(expr))之后经过第4步获得的),我们获得的表达式的结果是值,而不是引用。然后,当第二次对第一次的结果使用++或者--的时候,通过规范要求的第1步看到首先会将上一次++的结果赋给本次的expr,继续往下走到第五步需要执行PutValue(expr, newValue),这时候的expr已经是一个值,非引用,于是再去PutValue的时候,根据

Annotated ES5

的第一步,PutValue (V, W) 的V不是引用的时候,自然就抛出错误了,于是更通俗的说就是“++ UnaryExpression”中的UnaryExpression需要是一个左值表达式。所以,“规范中并没有看到相关的说明”不尽然,只是已经在相关稍微细小的环节说明了。




  

相关话题

  为什么 JS 不能绕过后端代码直接调数据库,有哪些后端处理的逻辑,JS 不能写? 
  为什么同样作为程序员,和BAT的差距就那么大呢? 
  JavaScript一个疑问,[ ] (空数组)== true ,具体如下,请问这是为何? 
  做开发你遇到最无理的需求是什么? 
  既然引用计数在做 GC 时有性能问题,为什么智能指针会广泛应用它? 
  《阮一峰版快速排序完全是错的》一文是否存在事实错误? 
  计算机专业的学生如何系统的学习前端技术? 
  为什么JavaScript不能成为自己的标准,非得冒出ES6成为JavaScript的标准呢? 
  React.js有哪些设计缺陷? 
  如何用通俗易懂的语言解释脚本(script)是什么? 

前一个讨论
为什么物体具有惯性?
下一个讨论
如何反驳「女性要生育,所以用人单位出于成本考虑而付给低工资」?





© 2024-05-19 - tinynew.org. All Rights Reserved.
© 2024-05-19 - tinynew.org. 保留所有权利