JavaScript中Map使用数组作为键的异常行为疑问
Map中数组作为键的引用相等问题解析
问题一:为何通过变量key能获取值,直接用[1,2]却不行?
执行代码如下:
let key = [1,2] let m = new Map() m.set(key, "12") console.log(m.get(key)) // 12 console.log(m.get([1,2])) // undefined
核心原因在于引用类型的特性:
- 数组属于引用类型,变量
key存储的是第一个数组在内存中的具体引用地址。m.set(key, "12")是把这个唯一的引用作为键存入Map。 - 而
m.get([1,2])里的[1,2]是新创建的数组,它的内存地址和key指向的数组完全不同。 - Map判断键是否相等采用SameValueZero算法,对于引用类型,只有当两个值指向同一个内存对象时,才会被判定为相等。所以新数组和原数组不属于同一个键,自然无法获取到对应的值。
问题二:为何多次用[1,2]作为键设置值,Map会生成多个条目而非覆盖?
执行代码:
m.set([1,2], "12") m.set([1,2], "123") m.set([1,2], "1234")
最终Map内容:
Map(4) { (2) […] → "12", (2) […] → "12", (2) […] → "123", (2) […] → "1234" } size: 4 <entries> 0: Array [ 1, 2 ] → "12" 1: Array [ 1, 2 ] → "12" 2: Array [ 1, 2 ] → "123" 3: Array [ 1, 2 ] → "1234"
本质逻辑和第一个问题一致:
- 每次调用
set([1,2], ...)时,[1,2]都会创建一个全新的数组对象,每个数组的内存引用都不重复。 - Map会把这些不同的引用识别为不同的键,因此每次
set操作都是新增一个键值对,而非覆盖已有键对应的值。
内容的提问来源于stack exchange,提问作者AO-
相关产品推荐
相关产品推荐

