Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript V8:实现平等测试_Javascript_C++_V8 - Fatal编程技术网

Javascript V8:实现平等测试

Javascript V8:实现平等测试,javascript,c++,v8,Javascript,C++,V8,如何在V8中为自己的类重新定义=运算符?例如: var v=Foo.BAR; var other=getBar();//返回与Foo.BAR相同的新实例 断言(v==其他);//我要真的 函数用C++在C++中定义,而不是直接在JS中定义。我知道这是可能的,因为它已经为String类完成了。V8开发人员 我知道这是可能的,因为这是为字符串类所做的 当然,JavaScript引擎可以并且确实定义了所有操作符所做的事情——这是它的工作。所以我不会说字符串的==操作符已经被重新定义;它只是被定义了

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

var v=Foo.BAR;
var other=getBar();//返回与Foo.BAR相同的新实例
断言(v==其他);//我要真的

函数用C++在C++中定义,而不是直接在JS中定义。我知道这是可能的,因为它已经为

String
类完成了。

V8开发人员


我知道这是可能的,因为这是为字符串类所做的

当然,JavaScript引擎可以并且确实定义了所有操作符所做的事情——这是它的工作。所以我不会说字符串的
==
操作符已经被重新定义;它只是被定义了

如果您愿意修改V8,则可以更改
==
操作符的行为。但这将是一个很大的工作,因为它不仅仅是定义了一个地方:你必须触摸C++运行时(从查看<代码> V8::对象::等于:/CUT>),点火解释器(查找<代码> TESTQuals<代码> > SRC/Delput/Delver Studio生成器.cc/COD>)和Turbofan编译器(grep代表
src/compiler/
中的
kJSEqual
,并调整在各个阶段的处理方式,最显著的是
JSTypedLowering::ReduceJSEqual
,但可能还有其他地方你也需要去触摸)

请注意,这是一个庞大的项目;依我看,沿着这条路走是不可取的。一个特别的困难将是获取您需要的信息(特别是,“这个对象是有问题的类之一的实例吗?”)对于您需要它的所有地方,我没有一个好的建议来实现这一点。另一个挑战是,将您的更改移植到新的V8版本将是相当耗时的维护工作


我的建议是使用
.equals
函数,该函数精确地定义在应该拥有它的类上。它干净、简单,易于维护/调整,并且对任何其他JavaScript开发人员(包括您自己未来的开发人员)都不会感到惊讶阅读您的代码。

为什么要这样做?这意味着您的程序/脚本将不再是标准的ECMAScript/JavaScript,也无法在其他引擎中工作。为什么不使用传统的
函数equals(other)
方法呢?“我知道这是可能的,因为它已经为String类完成了。”-
String
在JavaScript中不是一个类,它是一个内在类型,这就是为什么它有自己的
=
操作符行为-但它与
Number
Date
相同,它们也有值相等的
=
行为。“…这对任何其他JavaScript开发人员(包括您自己未来的自己)来说都不奇怪阅读您的代码”-这就是为什么运算符重载在支持它的语言中经常是一个坏主意。我希望更多的语言将运算符映射到众所周知的接口(例如,
=
总是转到
IEquatable.Equals
)。