簡體   English   中英

__hash__對於javascript?

[英]__hash__ for javascript?

有沒有辦法在js自定義哈希中給對象,就像重寫一樣

__hash__()

在python中,讓某人定義如何將給定對象散列到字典中。

我的基本問題是:使用什么哈希函數將js對象放入關聯數組中,我可以覆蓋它嗎?

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

神奇的方法是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

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM