__hash__对于javascript?

时间:2012-07-17 01:02:06

标签: javascript python hash associative-array dictionary

有没有办法在js自定义哈希中给对象,就像覆盖

一样
__hash__()
在python中的

让某人定义如何将给定对象散列到字典中。

我的基本问题是:使用什么哈希函数将js对象放入关联数组中,我可以覆盖它吗?

2 个答案:

答案 0 :(得分: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 :(得分: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术语,就好像dict在键上调用__repr__而不是__hash__(虽然这不是100%准确),这意味着您可以提供自定义{{1} }方法来控制你班级不同实例的平等。