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
映射中存储的数组的引用(不是它的副本)-son
变量存储常规数组,当然有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对象或数组)的值只有在它们将引用存储到内存中的同一位置时才被视为相等(因此两者都指向同一实例)。并创建两个单独的数组实例