访问JavaScript映射类似于普通对象

访问JavaScript映射类似于普通对象,javascript,node.js,dictionary,Javascript,Node.js,Dictionary,我在用地图 因为我想将一个对象存储为密钥 我的问题是-我可以像访问普通对象一样访问地图吗 例如: let m = new Map(); let obj = {foo:'bar'}; m[obj] = 'baz'; console.log(m[obj]); 这应该是正常工作,还是我需要使用映射的get/set方法 我问这个问题的原因是,如果我需要使用get/set,它会迫使我仔细地重构大量代码 下面是一个可能需要重构的真实代码示例: //在broker.wsLock之前是普通对象 //在brok

我在用地图

因为我想将一个对象存储为密钥

我的问题是-我可以像访问普通对象一样访问地图吗

例如:

let m = new Map();
let obj = {foo:'bar'};
m[obj] = 'baz';
console.log(m[obj]);
这应该是正常工作,还是我需要使用映射的get/set方法

我问这个问题的原因是,如果我需要使用get/set,它会迫使我仔细地重构大量代码

下面是一个可能需要重构的真实代码示例:

//在broker.wsLock之前是普通对象

//在broker.wsLock之后是一个映射实例


有什么方法可以将v设置在set调用的同一行上吗?

如果要访问Map对象的实际值,则必须使用.get和.set或各种迭代器

var m = new Map();
m.set("test", "foo");
console.log(m.get("test"));    // "foo"
地图上的常规属性访问,例如:

m["test"] = "foo"
只需在对象上设置常规属性-它不会影响实际的地图数据结构

我认为这样做是为了让您可以从地图数据结构的成员中分别访问地图对象属性,而不会将两者混淆

此外,常规属性只接受字符串作为属性名称,因此不能使用常规属性为对象编制索引。但是,当使用.set和.get时,映射对象具有这种功能

你要求得到一个明确的答案。在中,您可以查看.set的作用,并看到它在[[MapData]]内部插槽上运行,这肯定与对象的属性不同。同样,在该规范中也没有提到使用普通属性访问将访问内部对象[[MapData]]。所以,您只需要看到对象的普通属性访问是如何描述的。映射是一个对象,映射规范中没有任何内容表明普通属性访问的行为应该与其他对象的行为有所不同。事实上,它必须对Map对象上的所有方法采取相同的操作,否则,如果您碰巧在Map中放置了一个与方法名称具有相同键的项,它们将无法工作。所以,你的证据包括:

一个简单的测试将告诉您,属性访问不会在映射本身中放置任何内容,而只是一个常规属性。 等级库将贴图描述为对象。 规范描述了.get和.set如何在内部插槽[[MapData]]上操作。 规范中没有规定对映射对象的属性访问应该与通常的工作方式有任何不同。 如果property access确实访问了MapData,那么如果您在映射中放置了一个与方法名称冲突的键,那么您将无法访问方法——如果是这样的话,那将是一团混乱。
映射与任何其他JS对象一样,因此您可以像现在这样添加属性,但是,您所做的是添加属性[object object]——而不是添加实际的映射条目。换句话说,您需要使用set/getI,只是在控制台中尝试了您的示例-它似乎工作得很好。@Zac,它似乎工作得很好,值实际上没有分配给由实际对象表示的属性,而是设置为Jaromanda X提到的名为[object object object object]的属性。使用m.setobj,'baz';console.logm.getobj;是的,我正在寻找一个明确的答案,使用括号表示法非常方便,让我用一个更好的例子来更新这个问题。明白了,这使得senseYeah我需要使用map的原因是我可以使用一个对象作为键。谢谢你提供的信息。不过,我在寻找这种便利:让v=obj[x]=obj[x]|||'foo'@Olegzandr——我还发现处理分配给映射的默认值是一件痛苦的事情。我通常会使用一个helper函数或map的子类,该子类有新版本的.set,可以为您处理默认值。在我的例子中,当我有一个数组映射时,我需要向现有数组添加一个项或初始化一个新数组,但这是同一类型的问题。只需使用一些新方法为自己创建一些帮助函数或Map的子类即可。
var m = new Map();
m.set("test", "foo");
console.log(m.get("test"));    // "foo"
m["test"] = "foo"