为什么 Map.has() return false 对于确实存在的 Integer 键?
Why does Map.has() return false for an Integer key that does exist?
我有一个由几个键:值对组成的映射,键都是整数(然后当然存储为字符串)。
但是,我无法使用 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
使用 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()
到 return 您“更正”结果,因为地图结构实际上是空的。始终使用 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
。
我有一个由几个键:值对组成的映射,键都是整数(然后当然存储为字符串)。
但是,我无法使用 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
使用 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()
到 return 您“更正”结果,因为地图结构实际上是空的。始终使用 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
。