我想解释这个地图功能:
let m = new Map().set('items', ["a", "b", "c"]);
console.log(m.get('items')); // ["a", "b", "c"]
let n = m.get('items');
console.log(n); // ["a", "b", "c"]
n.push("d");
console.log(n); // ["a", "b", "c", "d"]
console.log(m.get('items')); // ["a", "b", "c", "d"]
价值' d'添加到Map m而不调用Map.set()?
答案 0 :(得分:2)
只有一个数组,在运行m.get('items')
时没有克隆,而是提供了对数组的引用。
您可以通过执行以下操作来确认:
n === m.get('items') // returns true
相反,即使它们什么都不包含,两个数组也不相等。例如:
[] === [] // returns false
非常酷,我没有意识到这种行为,但它有道理。尼斯!
答案 1 :(得分:1)
因为n
变量存储了对存储在m
Map(而不是它的副本)中的数组的引用 - 所以n
变量存储了常规数组,当然这个数组push
}方法和m
映射存储引用相同的数组,因此它看到更新的数组。因此,n
变量和映射items
条目共享引用同一个数组。请注意,这是所有JS引用类型的典型行为。如果m
映射了基本类型的存储值(例如字符串),则必须使用set
在地图中更新它。