微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 Map.has() 对于确实存在的 Integer 键返回 false?

如何解决为什么 Map.has() 对于确实存在的 Integer 键返回 false?

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

但是,我无法使用 Map.prototype.has("1")Map.prototype.has(1) 来确认地图中存在键。我该怎么做?我想使用 Map.prototype.has() 方法来避免整个 0 is 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

解决方法

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

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
,

当您执行 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);

enter image description here

[[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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。