es6映射设置而不调用map.set()

时间:2017-03-10 13:36:09

标签: ecmascript-6 maps invoke

我想解释这个地图功能:

 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()?

2 个答案:

答案 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在地图中更新它。