Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
__javascript的哈希值?_Javascript_Python_Hash_Associative Array_Dictionary - Fatal编程技术网

__javascript的哈希值?

__javascript的哈希值?,javascript,python,hash,associative-array,dictionary,Javascript,Python,Hash,Associative Array,Dictionary,有没有一种方法可以在js自定义哈希中提供对象,就像重写一样 __hash__() 在python中,让我们定义如何将给定对象散列到字典中 我的基本问题是:什么样的散列函数用于将js对象放入关联数组,我能克服它吗?在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