Ecmascript 6 es6在不调用map.set()的情况下映射设置

Ecmascript 6 es6在不调用map.set()的情况下映射设置,ecmascript-6,maps,invoke,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

我想解释一下这张地图的功能:

 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.set()的情况下添加到Map m的?

因为
n
变量存储对
m
映射中存储的数组的引用(不是它的副本)-so
n
变量存储常规数组,当然有
push
方法和
m
映射存储对同一数组的引用,以便看到更新的数组。因此
n
变量和map
条目共享都指向同一个数组。请注意,这是所有JS引用类型的典型行为。如果
m
映射基元类型的存储值(例如字符串),则必须使用
set
在映射中更新它

因为
n
变量存储对存储在
m
映射中的数组的引用(不是它的副本)-所以
n
变量存储常规数组,当然有
push
方法,
m
映射存储对同一数组的引用,以便看到更新的数组。因此
n
变量和map
条目共享都指向同一个数组。请注意,这是所有JS引用类型的典型行为。如果
m
映射基元类型的存储值(例如字符串),则必须使用
set
在映射中更新它

只有一个数组,在运行
m.get('items')
时不会克隆它,而是提供了对该数组的引用

您可以通过执行以下操作来确认这一点:

n==m.get('items')//返回true

相反,两个数组即使不包含任何内容也不相等。例如:

[]==[]//返回false


很酷,我没有意识到这种行为,但它是有道理的。很好

只有一个数组,在运行
m.get('items')
时不会克隆它,而是提供了对该数组的引用

您可以通过执行以下操作来确认这一点:

n==m.get('items')//返回true

相反,两个数组即使不包含任何内容也不相等。例如:

[]==[]//返回false


很酷,我没有意识到这种行为,但它是有道理的。很好

同意,不是说push方法,而是后面的map.get()。
d
值如何包含在映射键/值对“items”中,而不显式地说m.set('items',[“a”,“b”,“c”,“d”)?@mhakes,因为数组是一个对象,而存储在该映射中的东西是对该对象的引用。这与地图无关,但与JS的总体工作方式有关。@EranSch和@estus都在说同样的话。你是对的,这是基本的JS行为,我也在想,映射的行为类似于类,除非被调用,否则不会触发。调用不是引用的正确术语,它是固有的.Agreed,不是说push方法,而是后面的map.get()。
d
值如何包含在映射键/值对“items”中,而不显式地说m.set('items',[“a”,“b”,“c”,“d”)?@mhakes,因为数组是一个对象,而存储在该映射中的东西是对该对象的引用。这与地图无关,但与JS的总体工作方式有关。@EranSch和@estus都在说同样的话。你是对的,这是基本的JS行为,我也在想,映射的行为类似于类,除非被调用,否则不会触发。调用不是正确的引用术语,它是与生俱来的。谢谢,这是我的直觉;它是通过引用捕获的,在尝试比较从映射检索到的数组中的更改时捕获的,然后将其与原始映射版本(我现在理解为唯一的)进行比较。希望这能让你sense@EranSch是的,在JS中,重引用类型(e.q对象或数组)的值只有在它们将引用存储到内存中的同一位置时才被视为相等(因此两者都指向同一实例)。并且创建两个独立的数组实例谢谢,这是我的直觉;它是通过引用捕获的,在尝试比较从映射检索到的数组中的更改时捕获的,然后将其与原始映射版本(我现在理解为唯一的)进行比较。希望这能让你sense@EranSch是的,在JS中,重引用类型(e.q对象或数组)的值只有在它们将引用存储到内存中的同一位置时才被视为相等(因此两者都指向同一实例)。并创建两个单独的数组实例