定义用于ES6映射的自定义hash()方法

Sir*_*rko 5 javascript dictionary ecmascript-6

为了说明问题,请考虑以下简单对象

function Key( val ) {
  this._val = val;
}
Run Code Online (Sandbox Code Playgroud)

现在我创建一个ES6 Map实例并像这样输入一个条目

var map = new Map(),
    key1 = new Key( 'key' );

map.set( key1, 'some value' );

console.log( 'key1: ', map.has( key1 ) );
// key1:  true
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都很好.我们面临的挑战,但是,来了,如果我创建了一个几乎相同的物体key2像这样

var key2 = new Key( 'key' );
Run Code Online (Sandbox Code Playgroud)

所以基本上两个键都是相同的,但显然key2不是地图的一部分

console.log( 'key2: ', map.has( key2 ) );
// key2:  false
Run Code Online (Sandbox Code Playgroud)

JavaScript在此处使用对象引用作为键,因此两个单独的对象不会指向相同的值.

我现在要做的是,向hash()key 添加类似方法的东西prototype,以便两个对象都指向同一个键.这样的事情可能吗?


我知道,有一种方法可以使用工厂模式Key和一些缓存来解决问题.然而,这导致关于对象的不可变性和防止旧对象被垃圾收集的高速缓存的许多问题.所以我认为这不是一个真正的选择.

Ber*_*rgi 5

这样的事情可能吗?

不,这是ES6 Collections的一个众所周知的缺陷.他们所做的就是检查参考标识,并且没有办法改变它.

您可以做的最好的事情(如果哈希消耗实例不是您所说的选项)不是使用对象作为键.相反,使用编码Key值的字符串,并在两个表示之间来回转换.鉴于您认为您的密钥是不可变的,这不应该成为问题.