JavaScript是否允许为对象字段设置键?

JavaScript是否允许为对象字段设置键?,javascript,hashmap,Javascript,Hashmap,当我运行以下代码时: fake_key = new Set([{v: 1, w: 2}]) fake_memo = {}; fake_memo[fake_key] = 2; fake_key = new Set([{v: 5, w: 5}]) fake_memo[fake_key] = 5; 然后打印或记录假备忘录,我希望看到: { '[object Set]': 2, '[object Set]': 5 } 相反,我得到: { '[object Set]': 5 } 就好像我插入到对象

当我运行以下代码时:

fake_key = new Set([{v: 1, w: 2}])
fake_memo = {};
fake_memo[fake_key] = 2;

fake_key = new Set([{v: 5, w: 5}])
fake_memo[fake_key] = 5;
然后打印或记录
假备忘录
,我希望看到:

{ '[object Set]': 2, '[object Set]': 5 }
相反,我得到:

{ '[object Set]': 5 }
就好像我插入到对象贴图中的第一个对象被第二个对象撞到一样


为什么会发生这种情况?如何恢复所需的行为(两个键都插入到地图中)?

普通对象的属性键始终是字符串。您的集合正在转换为字符串,这将始终提供字符串
“[对象集合]”

您可以改为使用贴图实例而不是普通对象,因为贴图键可以是任何类型的值。为此,请制作一张地图:

fake_memo = new Map();
然后

等用途

var value = fake_memo.get(some_key);
检索值


您可以对映射实例使用普通的
[]
操作,但这仍然会将映射视为普通对象。

普通对象的属性键始终是字符串。您的集合正在转换为字符串,这将始终提供字符串
“[对象集合]”

您可以改为使用贴图实例而不是普通对象,因为贴图键可以是任何类型的值。为此,请制作一张地图:

fake_memo = new Map();
然后

等用途

var value = fake_memo.get(some_key);
检索值


您可以在地图实例上使用普通的
[]
操作,但这仍然会将地图视为普通对象。

另一个答案是,键只能是字符串。因此,这可能是您正在寻找的:

fake_key = JSON.stringify(Array.from(new Set([{v: 1, w: 2}])));
fake_memo = {};
fake_memo[fake_key] = 2;

fake_key = JSON.stringify(Array.from(new Set([{v: 5, w: 5}])));
fake_memo[fake_key] = 5;

正如另一个答案所说,键只能是字符串。因此,这可能是您正在寻找的:

fake_key = JSON.stringify(Array.from(new Set([{v: 1, w: 2}])));
fake_memo = {};
fake_memo[fake_key] = 2;

fake_key = JSON.stringify(Array.from(new Set([{v: 5, w: 5}])));
fake_memo[fake_key] = 5;

对象以字符串作为键。该集合将转换为字符串,即
“[对象集合]”
。请使用映射。在JS中,对象键也是字符串,毫无例外,JS对象不是hashmaps。对象将字符串作为键。该集合将转换为字符串,即
“[对象集合]”
。请使用映射。在JS对象中,键也是字符串,毫无例外,JS对象不是hashmaps。如果我更改为
false_memo=new Map(),行为将保持不变。更具体地说,我现在看到
Map{'[objectset]':5}
;我将扩展答案。因此
Map.set
Map.get
在行为上与
Map[accessor]=foo
不同@AlekseyBilogur是的,这令人不安。您可以使用代理功能来解决这个问题,但这取决于您的观点,这可能比默认行为更令人困惑。我对Set或Map都没有做太多的工作,所以我的观点在这方面没有多大价值:)我接受这个答案,因为它显然是正确的,但这个API真是太棒了!如果我更改为
fake_memo=new Map(),行为将保持不变。更具体地说,我现在看到
Map{'[objectset]':5}
;我将扩展答案。因此
Map.set
Map.get
在行为上与
Map[accessor]=foo
不同@AlekseyBilogur是的,这令人不安。您可以使用代理功能来解决这个问题,但这取决于您的观点,这可能比默认行为更令人困惑。我对Set或Map都没有做太多的工作,所以我的观点在这方面没有多大价值:)我接受这个答案,因为它显然是正确的,但这个API真是太棒了!