新的ES 6(Harmony)引入了新的Set对象.Set使用的身份算法类似于===运算符,因此不太适合比较对象:
var set = new Set();
set.add({a:1});
set.add({a:1});
console.log([...set.values()]); // Array [ Object, Object ]
Run Code Online (Sandbox Code Playgroud)
如何自定义Set对象的相等性以进行深层对象比较?有没有像Java这样的东西equals(Object)?
考虑到这个JavaScript"类"定义,这是我能想到的最好的方法来解决这个问题:
var Quota = function(hours, minutes, seconds){
if (arguments.length === 3) {
this.hours = hours;
this.minutes = minutes;
this.seconds = seconds;
this.totalMilliseconds = Math.floor((hours * 3600000)) + Math.floor((minutes * 60000)) + Math.floor((seconds * 1000));
}
else if (arguments.length === 1) {
this.totalMilliseconds = hours;
this.hours = Math.floor(this.totalMilliseconds / 3600000);
this.minutes = Math.floor((this.totalMilliseconds % 3600000) / 60000);
this.seconds = Math.floor(((this.totalMilliseconds % 3600000) % 60000) / 1000);
}
this.padL = function(val){
return (val.toString().length === 1) ? "0" + val : val;
}; …Run Code Online (Sandbox Code Playgroud) 我有一个自定义的Javascript类(使用John Resig的简单Javascript继承创建).我希望能够比较这个类的两个实例,使用==,<,>,>=,和<=符号.
如何覆盖自定义类的比较器?
我想定义一个JavaScript类,Foo.
Foo = function(value){
this.value = value;
};
Run Code Online (Sandbox Code Playgroud)
我将创建我的Foo的"实例":
foo1 = new Foo(1);
foo2 = new Foo(1);
Run Code Online (Sandbox Code Playgroud)
我希望我的Foo实例可以使用标准的==相等运算符相互比较:
foo1 == foo2; // this should be true
Run Code Online (Sandbox Code Playgroud)
我找不到办法做到这一点.我以为我正在使用该valueOf()函数,但这仅在比较的一侧是基元时才有用,而不是如上所述两者都是对象类型.
我是否遗漏了一些非常类似于Ruby的东西
def ==(obj); end
Run Code Online (Sandbox Code Playgroud) 我用Dojo.declare创建了新对象.如何为对象重载operator ==?
在 Python 中,可以==通过__eq__为您的类定义一个方法来覆盖它的作用。
是否可以在 Javascript 中做类似的事情?如果是这样,你怎么做?
我的理解是,默认情况下(也许总是,如果您不能覆盖它),Javascript 只是检查当您执行==. 如何直接获取地址?
我问所有这些是因为我正在尝试调试一些很久以前写过的代码。据我所知,两个对象是相同的,但==正在返回false. 我试图找出原因......我想知道是否可能==在某个地方被覆盖(但它是一个很大的代码库,我不知道要搜索什么)或者对象是否或是否可能被复制,所以它们存在于不同的地址,尽管据我所知是相同的。知道如何获取地址将有助于确认该理论并为我提供线索以解决问题。
我想在 Javascript 中创建一个 Map(字典),其中键是数字数组,值是某个对象。我想从地图中检索以前使用相同数组内容存储的值 - 即,如果我有一个包含某些内容的数组,我想检索以前为具有相同内容的数组存储的值(如果有)。
在大多数其他语言中,这很容易。您可以重写 Map 的相等函数,以便测试具有相同内容的两个数组相等。这似乎不可用 Javascript。映射键正在使用 SameValueZero 进行测试,它仅在两个对象是同一对象时才认为它们相等。
有没有一种方法可以覆盖相等性,或者是否有另一种标准方法可以在 Javascript 中处理这种情况?
javascript ×7
class ×1
comparison ×1
dictionary ×1
dojo ×1
equality ×1
equals ×1
inheritance ×1
object ×1
overriding ×1
set ×1