在本文中,我将探讨如何为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)
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进行跟踪。
nice啊啊啊啊啊
sdaf