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

时间:2018-08-14 16:54:45

标签: 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;

然后打印或登录fake_memo,我希望看到:

{ '[object Set]': 2, '[object Set]': 5 }

相反,我得到了:

{ '[object Set]': 5 }

好像我插入对象映射中的第一个对象被第二个对象淹没了。

为什么会这样?如何恢复我想要的行为(两个键都插入到地图中)?

2 个答案:

答案 0 :(得分:3)

普通对象的属性键始终是字符串。您的集合将被转换为字符串,该字符串始终提供字符串<select>

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

<script src="//unpkg.com/angular/angular.js"></script>
<body ng-app ng-init="count=0">
   <button ng-click="count = count + 1" ng-disabled="stop" >Click Me</button>
   <div>Count={{count}}</div>
   <input type="checkbox" ng-model="stop">Stop counting<br>
</body>

然后

"[object Set]"

等使用

fake_memo = new Map();

检索值。

您可以在Map实例上使用普通的fake_memo.set(fake_key, 2); 操作,但是仍然会将Map视为普通对象。

答案 1 :(得分:1)

正如另一个答案所说,键只能是字符串。所以这可能就是您要寻找的东西:

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;