4

我有一个由几个键组成的映射:值对,键都是整数(然后当然存储为字符串)。

但是,我不能使用Map.prototype.has("1")也不能Map.prototype.has(1)确认地图中是否存在密钥。我该怎么做呢?我想使用该Map.prototype.has()方法以避免整体0问题false

let map = new Map();
map[1] = 2;
console.log(map); //Map { 1: 2 }
console.log(map.has("1")); //false
console.log(map.has(1)); //false

4

2 回答 2

5

Map.prototype.set不使用map[1] = 2。地图是有自己的一套规则的对象,所以你不能像上面那样设置它。在这里了解更多。

let map = new Map();
map.set(1,2);
console.log(map); // Map(1) { 1 => 2 }
console.log(map.has("1")); //false
console.log(map.has(1)); //true
于 2021-03-16T20:47:11.723 回答
4

当您这样做时,map[1] = 2;您不是在地图数据结构本身中设置项目,而是在基础通用对象上。因此,您不能期望与地图相关的方法has()能够get()返回“正确”的结果,因为地图结构实际上是空的。始终使用 设置地图属性map.set()

另外,请注意Map不支持索引。你不能通过做得到一个项目map[key]。这将再次访问底层对象的属性。你必须map.get()改用。

您可以通过执行以下操作看到差异:

let testMap = new Map();

testMap['prop1'] = 'prop1value';
testMap.set('prop2', 'prop2value');
testMap.set('prop1', 'prop1value');

console.log(testMap);

在此处输入图像描述

[[Entries]]是实际的地图结构,其他一切都来自对象。

为了完整起见,对象属性只能是字符串或符号。另一方面,Map 支持所有类型(包括对象和函数)。我这么说是因为如果你这样做:

let testMap = new Map();
    
testMap['1'] = 'prop1value';
testMap[1] = 'prop2value';

你实际上改变了相同的属性('1',数字键实际上被转换为字符串)。但是,如果您使用实际的地图结构:

let testMap = new Map();

testMap.set('1', 'prop1value');
testMap.set(1, 'prop2value');

您有两个单独的条目:'1'1

于 2021-03-16T20:52:50.327 回答