十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

哪些运算符可以重载?proposal-operator-overloading 超全清单:支持与禁止一目了然

哪些运算符可以重载?proposal-operator-overloading 超全清单:支持与禁止一目了然 哪些运算符可以重载proposal-operator-overloading 超全清单支持与禁止一目了然【免费下载链接】proposal-operator-overloading项目地址: https://gitcode.com/gh_mirrors/pr/proposal-operator-overloading运算符重载Operator Overloading是指让、-、*这类运算符对自定义类型产生特定行为的能力。proposal-operator-overloading是探索 JavaScript 运算符重载可行方案的 TC39 提案其文档用一份超全清单清楚划分了「支持重载」与「禁止重载」的运算符边界。本文带你快速看懂这份清单哪些运算符可以重载、哪些必须绕道支持与禁止一目了然新手也能轻松理解。小提示本文面向新手无需深入源码也能读懂想研究底层机制的同学可顺带翻阅项目里的 PROTOSPEC.md 与 LANGCOMP.md。什么是运算符重载先花 30 秒理解概念平时写1 2的行为是语言内置的。运算符重载的意思是让、*、等运算符在遇到自定义类型时执行我们自己定义的逻辑。例如提案用例中的Decimal十进制小数类型Decimal(1) Decimal(2) // 结果Decimal(3) Decimal(3) * Decimal(2) // 结果Decimal(6)、*直接作用于自定义类型这就是运算符重载的直观体验。矩阵、向量、复数、CSS 单位换算等场景都能因此写出更自然的表达式而不是一串冗长的方法调用链。proposal-operator-overloading 项目是什么这是一个探索性的 JavaScript 运算符重载提案仓库里不仅有完整的设计文档还附带一套可运行的原型实现README.md提案主文档含全部用例、设计目标与使用说明PROTOSPEC.md接近规范文本的低层机制说明LANGCOMP.md与 Python、Ruby、C、Rust、Matlab 等语言的横向对比src/shim/运行时支持库operator-overloading-shimsrc/transform/配套的 Babel 编译插件需要说明的是该项目目前状态为Withdrawn已撤回属于探索性提案。但它对运算符重载边界的梳理非常完整尤其是「哪些运算符可以重载」这份清单至今仍是很好的参考。支持重载的运算符完整清单 ✅数学运算符类型运算符一元、-、、--二元、-、*、/、%、**乘方位运算符类型运算符一元~按位取反二元、^、|、、、比较运算符、、、、都在重载范围内。这里有个省事的小技巧你只需定义、、会自动由它推导出来同理、-这类复合赋值运算符也会由对应的二元运算符自动推导无需重复定义。整数下标访问可选支持[]与[]按整数下标进行读取与赋值。它属于「可能支持」的范围底层需要借助类似 TypedArray 整数索引对象的语义甚至会用上 Proxy性能敏感的场景要谨慎使用。禁止重载的运算符清单 ❌以下运算符无论怎么定义都不会生效原因也非常直白运算符禁止原因!、、||布尔运算先做 ToBoolean 再基于布尔值工作严格相等永远走内置定义SameValue / SameValueZero.与非常量整数下标的[]属于属性访问想自定义请用 Proxy()函数调用想自定义请用 Proxy,逗号运算符只返回右操作数未来如果管道运算符|、可选链?.、空值合并??等提案落地它们同样不支持重载——因为它们本质上是基于函数调用、属性访问和空值判断的语法糖。容易被忽略的边界规则 ⚠️字符串String的特殊待遇字符串只能为和比较运算符、等定义重载其他「数值类」运算符对它没有意义——毕竟字符串不该被当成数字用。布尔与符号完全不可重载Boolean和Symbol作为非数值、非字符串的基本类型完全不支持重载这是提案刻意设计的约束防止语言语义被破坏。普通对象的降级处理当一个普通对象与一个带重载的对象做运算时普通对象会先被强制转换为原始值primitive。因此「两边都声明了重载」才是推荐用法。使用前必须先声明提案要求通过with operators from声明显式开启某个类型的重载未声明就使用会直接抛出TypeError。这一设计为代码的可预测性加了保险避免一个对象悄悄改变既有代码的行为。想亲手试试两分钟跑通最小示例原型实现分为两部分Babel 插件负责语法转换shim 负责运行时支持。安装命令如下npm install --save-dev littledan/plugin-transform-operator-overloading npm install --save-prod littledan/operator-overloading-shim然后在.babelrc中注册插件{ plugins: [littledan/plugin-transform-operator-overloading] }之后用Operators工厂函数定义运算符集合让自定义类继承它再用withOperatorsFrom(MyClass)原型实现中代替with operators from语法开启即可。完整实现可参考src/shim/shim.js与src/transform/plugin.js。总结一张表记住支持与禁止类别可以重载禁止重载数学一元 - --二元 - * / % **—位运算~ ^ | —比较 、布尔运算属性/调用整数下标[]可选.、函数调用()、逗号,未来提案—|、?.、??一句话总结数值、位、比较类运算符可以重载逻辑、严格相等、属性访问与函数调用永远被排除在外。如果你对底层机制好奇可以深入PROTOSPEC.md查看运算符分发的完整算法想做跨语言对比LANGCOMP.md已经为你整理好了各大语言的实现差异。想克隆仓库体验源码可执行git clone https://gitcode.com/gh_mirrors/pr/proposal-operator-overloading【免费下载链接】proposal-operator-overloading项目地址: https://gitcode.com/gh_mirrors/pr/proposal-operator-overloading创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表