通过转换器在Javascript中实现运算符重载

Tri*_*tan 7 javascript coffeescript

对于我们中的一些人来说,使用Javascript的一个问题是缺少运算符重载.这使得编写数字库变得尴尬.例如,我们可能想写一些类似的东西:

var a = new BigInteger(5);
var b = new BigInteger(10);
var c = a + b;
Run Code Online (Sandbox Code Playgroud)

一种可能的解决方案是使用运算符重载到Javascript来转换语言.虽然可行 - 通过函数调用和类型检查替换运算符 - 但似乎共识似乎是在不破坏性能的情况下这是不可能的.由于这个原因,CoffeeScript拒绝了这个想法:

https://github.com/jashkenas/coffee-script/issues/846

但真的没有聪明的解决方案吗?

例如,可能有可能从紧密循环中提升类型检查或使用一些其他管道,现代JS编译器可以在类型为数字时优化掉添加的内容.

想法?

Tob*_* P. 1

看看Scala是如何实现运算符重载的:

他们定义每个运算符都是对对象的方法调用,因此您的示例是:

var c = a["+"](b);
Run Code Online (Sandbox Code Playgroud)

如果你停在这里,你可以简单地实现方法重载,该函数必须检查参数传递的值。如果您想开发更好的解决方案,请阅读 Odersky 的《Scala 编程》一书,并花一些时间阅读他们如何解决问题的所有想法(这是一个非常好的解决方案!)