微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

对于我们中的一些人来说,使用 Javascript一个问题是缺少运算符重载.这使得编写数字库变得尴尬.例如,我们可能想写一些类似的东西:
var a = new BigInteger(5);
var b = new BigInteger(10);
var c = a + b;

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

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

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

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

想法?

解决方法

你是否真的确定你需要用大数字编写正常数字的旧函数(使用传统的运算符)?如果您只是为了方便自己的功能需要重载,那么您可以通过使用不同的自定义操作符来获取bignums.

例如,您可以编写一个安全转换的编译器

var d = a <+> b <*> c;

var d = (a).add((b).multiply(c));

或者,如果你想要自动转换……

var d = toBignum(a).add(toBignum(b).multiply(toBignum(c)));

我没有真正看到你能够在没有大麻烦的情况下强制重载现有的实现.虽然你可以用teoretically替换所有出现的< >等等,目前的Javascript实现并未针对此进行优化,我甚至不想开始思考如果您尝试将bignum传递给引擎盖下的本机C函数之一会发生什么. 编辑:不需要覆盖基本整数类是重要的一点(注意你给出的链接如何,覆盖是这个人想要的第一件事……).我不认为您将能够找到某种“魔术”优化,因为您无法控制客户端使用的许多JS实现中的哪一个. 如果你真的不喜欢像< >区分一个普通的运算符(你不应该干涉)和一个花哨的运算符(你想做bignum的东西)的唯一方法是在Javascript之上强制某种特殊的打字系统,也许是通过评论,定制语法或(如评论中所述)匈牙利表示法. IMO,只需要解决一个自定义的操作符名称,你就会更少讨厌.

原文地址:https://www.jb51.cc/js/156848.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐