javascript中,如下代码,为何在car1=null之后,carMap.get(car1)的结果是undefined?我觉得应该依然是Corolla,因为如果是WeakMap的话,那应该是undefined,但实际是new Map(),依然会触发垃圾回收吗?为什么?
let carMap = new Map();
let car1 = { brand: 'Toyota' };
let car2 = { brand: 'Honda' };
carMap.set(car1, 'Corolla');
carMap.set(car2, 'Civic');
console.log(carMap.get(car1)); // 输出: Corolla 正常
console.log(carMap.get(car2)); // 输出: Civic 正常
car1 = null;
console.log(carMap.get(car1)); // 问题点:为什么会输出undefined?
console.log(carMap.get(car2)); // 输出: Civic 正常
并不是GC的问题,而是楼上说的
carMap.get(null)
的问题。你期望的是
car1
变更为了null
那么我给carMap
的设置的key
也会变成null
?但其实并不会。这点可以从简单的代码例子中看到:所以你在使用
carMap.get(car1)
时并不会获得期望的Corolla
输出。这部分就和你给对象的操作有关系了。当你将一个新的对象赋值给
car1
这个变量,那么变量car1
将指向新对象的内存地址。而不是原来的内存地址了。如果你要修改
car1
这个变量的值而不去修改这个变量的指向,那么你应该操作变量car1
,而不是直接给变量car1
赋值一个新的值 👇补充一个简易的Demo来说明赋值操作的区别:
相关阅读
javascript - Using Array objects as key for ES6 Map - Stack Overflow
24.1.3.6 Map.prototype.get (key) | ECMAScript® 2025 Language Specification
Object.is() - JavaScript | MDN