在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关联的值?谢谢!
答案 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);
。