You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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-

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:40:17