为JavaScript设计一个指数操作(运算)符


发布者 ourjs  发布时间 1407895723239
关键字 技术前沿  JavaScript 
在本文中,我将探讨如何为JavaScript设计一个新的幂运算符,我已经在提交了TC39的审议,并考虑加入ES7的语法规范。

在许多编程语言中,幂通过一个算术运算符来表达; 最常见的为x** y(Python和F#,Ruby,Perl等等),或 X^Y(BASIC,Lua中,MATLAB,R等)。其他语言包括JavaScript和C#依靠内置对象提供的一个函数来实现:Math.pow 和 Math.Pow。 

在JavaScript中通过一个特定的符号实现一个求幂运算,这是有道理的,这将更加有利于这种语言的教学和学习,因为它更加符合现代人的思维习惯。从上段所描述的两种设计中,我选择了**的形式,因为字符^已经被JavaScript用在按位异或运算中。该**形式可以更好的兼容复合赋值运算格式:**=,而且这种语义等价于内置函数Math.pow(假设它是完全按ECMA-262的定义来实现 )。 

代码

现有和将来的JavaScript实现形式:

Math.pow(2, 4) === 16;
Math.pow(-2, -4) === 0.0625;
2 ** 4 === 16;
-2 ** -4 === 0.0625;
var a = 2;
var b = -2;
a **= 4;
a === 16;
b **= -4;
b === 0.0625;

在为ES7定义一个新的语法形式之前,我们来看看现有的算述操作的语法定义。在ES5(和ES6)乘法表达式(MultiplicativeExpression)具有最高的优先级,然后是一元表达式(UnaryExpression),接着是附加表达式(AdditiveExpression)(等等 ): 

MultiplicativeExpression :
  UnaryExpression
  MultiplicativeExpression * UnaryExpression
  MultiplicativeExpression / UnaryExpression
  MultiplicativeExpression % UnaryExpression


这意味着下面的两个表达式有相同的结果:

-2 * 2 + 1 === -3;
1 + -2 * 2 === -3;

这是因为它们被以完全相同的顺序进行运算,尽管写的顺序不同,运算顺序是: 

1. 一元(-2) 
2. 乘法(-2*2) 
3. 一元运算符(-4,步骤2的结果) 
4. 结果(-4 + 1,1 + -4) 

幂运算一定要先于乘法,更重要的是,BNF范示必须被支持 ,使得运行是按右优先结合(不像MultiplicativeExpression,这是左结合)。下面的等示说明了关联性的要求:

a ** b ** c === Math.pow(a, Math.pow(b, c));

新的幂表达式(ExponentiationExpression)将取代乘表达示(MultiplicativeExpression)中的的一元表达式(UnaryExpression);变化如下: 

ExponentiationExpression : 
  UnaryExpression
  UnaryExpression ** ExponentiationExpression
MultiplicativeExpression :
  ExponentiationExpression
  MultiplicativeExpression * ExponentiationExpression
  MultiplicativeExpression / ExponentiationExpression
  MultiplicativeExpression % ExponentiationExpression


最后,复合赋值操作符将被添加到AssignmentOperator(赋值运算符)列表: 

AssignmentOperator : one of
  =
  *=
  /=
  %=
  +=
  -=
  <<=
  >>=
  >>>=
  &=
  ^=
  |=
  **=

截至今年,TC39 已经进入ECMAScript的四阶段审核过程。 并且,Erik Arvidsson已经用谷歌的试验编译器实现了一个验证版本。该提案是公开的进度可以在TC39/ECMA262进行跟踪。




回复 (3)
微信扫码 立即评论