百科问答小站 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需要是一个左值表达式。所以,“规范中并没有看到相关的说明”不尽然,只是已经在相关稍微细小的环节说明了。




  

相关话题

  2022 年,学完 JS 高级后的学习路线怎样规划? 
  你为什么不使用 TypeScript? 
  如何看待B站 (bilibili) 开源 HTML5 播放器内核 flv.js? 
  Javascript 初学者如何思考才可以把脑中的东西转换成代码写出来? 
  JS和Scheme对闭包变量的绑定能力差异,哪种更合理? 
  如何优雅地将程序设计语言的名字翻译成汉语? 
  2022 年,学完 JS 高级后的学习路线怎样规划? 
  为什么try catch能捕捉await后promise错误? 和执行栈有关系吗? 
  随着 JavaScript 越来越完善,还有必要学习 TypeScript 吗? 
  有多大比例的前端工程师,能在合理的时间内独立开发出一个足以供商业网站使用的文本编辑器? 

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





© 2025-04-18 - tinynew.org. All Rights Reserved.
© 2025-04-18 - tinynew.org. 保留所有权利