有沒有給JS中的自定義哈希對象的方式,就像在Python咱們有人定義一個給定的對象是如何散列到字典覆蓋__hash__ for javascript?
__hash__()
。
我的根本問題是:什麼哈希函數用於將js對象放入關聯數組中,我可以忽略它嗎?
有沒有給JS中的自定義哈希對象的方式,就像在Python咱們有人定義一個給定的對象是如何散列到字典覆蓋__hash__ for javascript?
__hash__()
。
我的根本問題是:什麼哈希函數用於將js對象放入關聯數組中,我可以忽略它嗎?
你的意思是使用對象作爲鍵,你如何確保你再次訪問該鍵?
神奇的方法是toString()
。發現JS中的所有對象都使用字符串鍵,如果它不是字符串,則調用toString()
方法。
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
你可以這樣做嗎?哇。 – 2012-07-17 01:18:04
+1爲正確的點,不像我的答案,其中包括這些信息以及其他一些不直接相關的東西。 – abarnert 2012-07-17 01:18:43
在底部增加了一個JSWTF塊,導致爲什麼沒有。 – 2012-07-17 01:28:58
在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
方法來控制班級的不同實例的相等性。
你爲什麼要? – 2012-07-17 01:03:13