有没有办法在 js 自定义哈希中赋予对象,就像覆盖一样
__hash__()
在 python 中,让我们定义如何将给定对象散列到字典中。
我的基本问题是:什么哈希函数用于将 js 对象放入关联数组中,我可以覆盖它吗?
有没有办法在 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
方法来控制类的不同实例的相等性。