V8:实现相等性测试

V8: implement equality test

如何在 V8 中为我自己的 class 重新定义 == 运算符?例如:

var v = Foo.BAR;
var other = getBar(); // returns a new instance of the same as Foo.BAR

assert(v == other); // I want true

函数是用C++用V8定义的,不是直接用JS定义的。我知道这是可能的,因为 String class.

已经完成了

这里是 V8 开发人员。

I know it's possible as it has been done for the String class.

当然,JavaScript 引擎可以而且确实定义了所有操作员的工作——这就是它的工作。所以我不会说 == 运算符已被 re 定义为字符串;它只是被定义.

如果您愿意修改 V8,那么您可以更改 == 运算符的行为。但这需要做很多工作,因为定义它的地方不止一个:您必须接触 C++ 运行时(从 v8::internal::Object::Equals 开始)、Ignition 解释器(寻找 TestEquals in src/interpreter/interpreter-generator.cc) 和 Turbofan 编译器(grep for kJSEqual in src/compiler/ 并调整它在各个阶段的处理方式,最显着的是 JSTypedLowering::ReduceJSEqual 但有可能还有其他你必须触摸的地方)。

请注意,这是一项庞大的工程;恕我直言,不建议走这条路。一个特别的困难是将你需要的信息(具体来说,"is this object an instance of one of the classes in question?")送到你需要它的所有地方;对于如何实现这一点,我没有很好的建议。另一个挑战是将您的更改移植到新的 V8 版本将是一项非常耗时的维护工作。

我的建议是使用 .equals 函数,该函数恰好定义在应该具有它的 类 上。这很干净、简单,很容易 maintainable/adaptable,并且对阅读您的代码的任何其他 JavaScript 开发人员(包括您未来的自己)都不足为奇。