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 开发人员(包括您未来的自己)都不足为奇。
如何在 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 开发人员(包括您未来的自己)都不足为奇。