2012-05-10 63 views
21

是否有可能重寫JavaScript中的等價比較呢?覆蓋等價比較在Javascript

我已經得到一種溶液最接近的是通過定義的valueOf功能和在該對象的前一個加調用的valueOf。

This Works。

equal(+x == +y, true); 

但是這失敗了。

equal(x == y, true, "why does this fail."); 

這裏是我的測試案例。

var Obj = function (val) { 
    this.value = val; 
}; 
Obj.prototype.toString = function() { 
    return this.value; 
}; 
Obj.prototype.valueOf = function() { 
    return this.value; 
}; 
var x = new Obj(42); 
var y = new Obj(42); 
var z = new Obj(10); 
test("Comparing custom objects", function() { 
    equal(x >= y, true); 
    equal(x <= y, true); 
    equal(x >= z, true); 
    equal(y >= z, true); 
    equal(x.toString(), y.toString()); 
    equal(+x == +y, true); 
    equal(x == y, true, "why does this fails."); 
}); 

演示在這裏:http://jsfiddle.net/tWyHg/5/

+0

究竟是什麼你試圖在這裏實現什麼? –

+0

@ElliotBonneville我在javascript中創建分數對象。 –

+0

分數對象的外觀如何?我們可以看到一些示例輸入嗎?或者,也許我只是誤解你試圖做... –

回答

10

上@Corkscreewe捎帶:

這是因爲你正在處理的對象和等效運營商只是要比較兩個變量是否引用同一個對象,而不是是否兩個對象莫名其妙相等。

一種解決方案是使用「+」在各變量的前部和限定用於對象的valueOf方法。這將調用每個對象上的valueOf方法以將其值「轉換」爲一個Number。你已經發現了這一點,但可以理解的是,它似乎並不滿意。

更有表現的解決方案可能會定義爲對象等號功能。使用上面的例子:

Obj.prototype.equals = function (o) { 
    return this.valueOf() === o.valueOf(); 
}; 

var x = new Obj(42); 
var y = new Obj(42); 
var z = new Obj(10); 

x.equals(y); // true 
x.equals(z); // false 

我知道這不會做的正是你想要的東西(重新定義了等效運營商自己),但希望這將讓你一點點接近。

+0

護理那'NaN === NaN'是錯誤的。 – Pacerier

2

如果這是你要找的,那麼你可能需要使用一些類似的全對象比較。

/* 
    Object.equals 

    Desc:  Compares an object's properties with another's, return true if the objects 
       are identical. 
    params: 
     obj = Object for comparison 
*/ 
Object.prototype.equals = function(obj) 
{ 

    /*Make sure the object is of the same type as this*/ 
    if(typeof obj != typeof this) 
     return false; 

    /*Iterate through the properties of this object looking for a discrepancy between this and obj*/ 
    for(var property in this) 
    { 

     /*Return false if obj doesn't have the property or if its value doesn't match this' value*/ 
     if(typeof obj[property] == "undefined") 
      return false; 
     if(obj[property] != this[property]) 
      return false; 
    } 

    /*Object's properties are equivalent */ 
    return true; 
} 
1
you can use Es6 Object.is() function to check the property of object. 

Object.prototype.equals = function(obj) 
{ 
    if(typeof obj != "Object") 
     return false; 
    for(var property in this) 
    { 
     if(!Object.is(obj[property], this[property])) 
      return false; 
    } 
    return true; 
}