在使用Map键值对引用类型时,我们经常会使用get和set方法对Map映射中的键值对进行读取和修改操作:
// 创建一个新的map
const personMap = new Map();
personMap.set('name', '张三');
personMap.set('age', 18);
console.log(personMap.get('name')); // 输出 "张三"
// 更新键 'age' 的值
personMap.set('age', 20);
console.log(personMap.get('age')); // 输出 20
// 添加新的键值对
personMap.set('class', '二班');
console.log(personMap.get('class')); // 输出 "二班"
在上面代码段中,键的类型都为字符串string格式,而Map的键可以使用各种类型,比如数组和对象等,所以我们可以这样定义一个新的键值对:
personMap.set(['语文','数学','英语'],[90,85,88]);
也就是把一个数组当做键。
这个时候我们可能会理所当然地使用这个数组键['语文','数学','英语']获取它对应的值[90,85,88],但是打印出来的结果却是这样的:
console.log(personMap.get(['语文','数学','英语'])); // 输出 undefined
// 使用set方法新增一个键值对
// 其中的键“['语文','数学','英语']”是一个引用类型
// 此时,会创建一个指针 p1 指向这个数组:
// p1 --> ['语文','数学','英语']
personMap.set(['语文','数学','英语'],[90,85,88]);
// 使用get方法获取键值
// 虽然这里的数组内容与上面的一致,但它们其实已经不属于同一个地址下的数组了
// 在get方法中,其实是相当于又创建了一个新的数组,然后又创建一个新的指针 p2
// p1 和 p2 指针所指向的地址不一致
// 自然地,在使用p2寻找p1指向的地址,就找不到了,返回undefined。
console.log(personMap.get(['语文','数学','英语'])); // 输出 undefined
那么如何保证我们get和set中引用的数组都是同一个呢?很简单,我们定义一个变量来存放这个数组,然后在get和set中都调用这个变量就行了!
const arr = ['语文','数学','英语']
personMap.set(arr,[90,85,88]);
console.log(`['语文','数学','英语']:${personMap.get(arr)}`);