[英]__hash__ for javascript?
有沒有辦法在js自定義哈希中給對象,就像重寫一樣
__hash__()
在python中,讓某人定義如何將給定對象散列到字典中。
我的基本問題是:使用什么哈希函數將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
在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術語來說,就好像dict在鍵上調用__repr__
而不是__hash__
(雖然這不是100%准確),這意味着你可以提供一個自定義的toString
方法來控制你班級不同實例的平等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.