为了说明问题,请考虑以下简单对象
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和一些缓存来解决问题.然而,这导致关于对象的不可变性和防止旧对象被垃圾收集的高速缓存的许多问题.所以我认为这不是一个真正的选择.
我一直试图掌握ES2015地图概念,有一点我不明白如下:
var mapRawObj = new Map();
var rawObj = {j:"I like penguin"};
mapRawObj.set(rawObj,true);
console.log(mapRawObj.get(rawObj)); //this outputs true
mapRawObj.set({j:"I like polar bear"},true);
console.log(mapRawObj.get({j:"I like polar bear"})); //this outputs undefined
Run Code Online (Sandbox Code Playgroud)
第一个工作,第二个不工作,我不明白为什么?
我认为当你将对象注册为键时,它就是对象本身,而不是对象的名称.这就是为什么在下面的例子中,当您重新分配密钥对象时,它会失败作为密钥?
var obj = { a:"hello ", b:"world "};
var mapObj = new Map();
mapObj.set(obj,true);
obj = {d:34}; //obj is re-assigned
console.log(mapObj.get(obj)); // outputs undefined
Run Code Online (Sandbox Code Playgroud)