Set()作为Javascript对象的键

时间:2019-07-15 03:17:18

标签: javascript set

在JavaScript中,我尝试以下操作:

let set1 = new Set([1]);
let set2 = new Set([2]);
let obj = {};
console.log("obj[set2] gives: ", obj[set2]);
obj[set1] = "Should be set1";

console.log(obj);
console.log("obj[set2] gives: ", obj[set2]);

看起来,它不是将Set对象当作键,而是使用字符串“ [object Set]”作为键,因此如果用作键,则使所有Set相同。为什么这是正确的行为?有没有一种方法可以将Set用作对象的键,以便我可以查找与特定Set关联的值?谢谢!

2 个答案:

答案 0 :(得分:2)

对象键只能是字符串(很少是符号)。如果您尝试分配一个不是字符串的键,则将其转换为字符串后再放入对象。

看看当您尝试将Set转换为字符串时会发生什么:

let set1 = new Set([1]);
let set2 = new Set([2]);
console.log(
  String(set1),
  String(set2)
);

无论集合包含什么内容,将其强制转换为字符串时,都会得到[object Set]。因此,正如预期的那样:

obj[set1]           ===  obj[set2]
obj['[object Set]'] ===  obj['[object Set]']

如果要使用非字符串键,则应使用Map,其“键”可以是任何值,而不仅仅是字符串:

let set1 = new Set([1]);
let set2 = new Set([2]);
const map = new Map();
console.log("obj[set2] gives: ", map.get(set2));
map.set(set1, "Should be set1");
console.log("obj[set2] gives: ", map.get(set2));

答案 1 :(得分:0)

这是因为obj[set1] = "Should be set1";确实是在说obj['undefined'] = 'Should be set1';,然后您正在测试另一个obj[set2],其中set2是未定义的(再次转换为字符串)< / em>,因此您得到'Should be set1'。如果您想知道某个集合中是否包含某些内容,则为setWhatever.has(value);