2012-07-17 58 views
2

有沒有給JS中的自定義哈希對象的方式,就像在Python咱們有人定義一個給定的對象是如何散列到字典覆蓋__hash__ for javascript?

__hash__() 

我的根本問題是:什麼哈希函數用於將js對象放入關聯數組中,我可以忽略它嗎?

+0

你爲什麼要? – 2012-07-17 01:03:13

回答

7

你的意思是使用對象作爲鍵,你如何確保你再次訪問該鍵?

神奇的方法是toString()。發現JS中的所有對象都使用字符串鍵,如果它不是字符串,則調用toString()方法。

http://jsfiddle.net/udsdT/1/

var objA = { 
    data: 'yay', 
    toString: function() { 
     return 'value_as_key'; 
    } 
}; 

var objB = { 
    data: 'some other totally data thing', 
    toString: function() { 
     return 'value_as_key'; 
    } 
} 


var foo = {}; 
foo[objA] = 'abc'; 
foo[objB] = 'def'; 
foo['value_as_key'] = 'qwe'; 
foo.value_as_key = 'omg'; 

foo[objA];   // 'omg' 
foo[objB];   // 'omg' 
foo['value_as_key']; // 'omg' 
foo.value_as_key; // 'omg' 

通常不過,你真的不想使用整個對象作爲鍵。特別是如果你不創建自己的toString()方法,由於基本對象的默認toString()方法是不完全很真棒......

({a:123}).toString() // [object Object] 
({b:456}).toString() // [object Object] 

var foo = {}; 
foo[{a:123}] = 'wtf'; 
foo[{asdf:9876}];  // 'wtf' 
foo['[object Object]']; // 'wtf 
+1

你可以這樣做嗎?哇。 – 2012-07-17 01:18:04

+0

+1爲正確的點,不像我的答案,其中包括這些信息以及其他一些不直接相關的東西。 – abarnert 2012-07-17 01:18:43

+1

在底部增加了一個JSWTF塊,導致爲什麼沒有。 – 2012-07-17 01:28:58

1

在JS中,你不能控制散列,但你不必。

兩件事情是相同的,如果他們是平等的。哈希不是定義的一部分,它只是一個實現細節。在封面下,兩個不同的對象可能具有相同的散列,但它們仍然不同,並且實現必須以神奇方式處理(例如,通過使用鏈式散列表)。

此外,對象的鍵總是字符串 - 解釋器會將哈希構造器內部,[]內或.內的值串化,而不是存儲實際值,這意味着很少出現第一個地方。

舉一些例子:

function X() {} 
x = new X() 
y = new Y() 
h = {x: 2, y: 3} // h has 2 members, named "x" and "y" 

a = (x, y) 
b = (x, y) 
h[a] = 4 
h[b] = 5 // h has 3 members, named "x", "y", and "[object Object]" 

放在Python的條款,就好像字典上的按鍵,而不是__hash____repr__(雖然這是不太100%準確),這意味着你可以提供一個自定義toString方法來控制班級的不同實例的相等性。