__javascript的哈希值?
有没有一种方法可以在js自定义哈希中提供对象,就像重写一样__javascript的哈希值?,javascript,python,hash,associative-array,dictionary,Javascript,Python,Hash,Associative Array,Dictionary,有没有一种方法可以在js自定义哈希中提供对象,就像重写一样 __hash__() 在python中,让我们定义如何将给定对象散列到字典中 我的基本问题是:什么样的散列函数用于将js对象放入关联数组,我能克服它吗?在js中,你不能控制散列,但你不必控制 如果两件事相等,那么它们是一样的。散列不是定义的一部分,它只是一个实现细节。实际上,两个不同的对象可能具有相同的散列,但它们仍然不同,实现必须神奇地处理这一点(例如,通过使用链接散列表) 此外,对象的键始终是字符串。解释器将在哈希构造函数内部、[
__hash__()
在python中,让我们定义如何将给定对象散列到字典中
我的基本问题是:什么样的散列函数用于将js对象放入关联数组,我能克服它吗?在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在键上调用了
\uuu repr\uuuu
,而不是\uuu hash\uuuuu
(虽然这不是100%准确),这意味着您可以提供一个自定义的toString
方法来控制类的不同实例的相等性。您的意思是使用对象作为键,如何确保再次访问该密钥
神奇的方法是toString()
。JS中的所有对象都使用字符串键,如果不是字符串,则调用toString()
方法
但通常情况下,您确实不希望将整个对象用作关键点。特别是如果您没有创建自己的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
+与我的答案不同,我的答案包含了这些信息以及其他一些不直接相关的东西。在底部添加了一个JSWTF块,因为为什么不呢。
({a:123}).toString() // [object Object]
({b:456}).toString() // [object Object]
var foo = {};
foo[{a:123}] = 'wtf';
foo[{asdf:9876}]; // 'wtf'
foo['[object Object]']; // 'wtf