2017-03-10 11 views
0

私は希望このマップ機能を起動せずに設定するには、次のように説明し ES6マップmap.set()

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"] 

がどのように値がMap.set()を呼び出すことなく、Mの地図に追加されます「D」のですか?

答えて

2

配列が1つしかありません。m.get('items')が実行されたときには複製されず、配列への参照が提供されます。

あなたはこのような何かをすることによってこれを確認することができます

n === m.get('items') // returns true

逆に、二つの配列は、彼らが何も含まれていない場合でも同じではありません。たとえば:

[] === [] // returns false

かなりクール、私はこの動作を認識していなかったが、それは理にかなっています。ニース!

+0

ありがとう、それは私の感覚でした。地図から取り出された配列の変更を比較しようとしている間にキャッチし、それを後で元のマップされたバージョンと比較します。期待しているのは – mhakes

+0

@EranSchはい、逆参照型(e.qオブジェクトまたは配列)のJS値は、メモリ内の同じ場所への参照を格納する場合にのみ等しいと見なされます(両方が同じインスタンスを指している)。そして '[] === []'は2つの別々の配列インスタンスを作成します –

1

nので変数店舗mマップに格納されている配列への参照(そのコピーではない) - 従ってn変数記憶それが更新さを見て、もちろん同じアレイにpush方法及びmマップ格納refernce有する規則的なアレイをアレイ。そのため、変数nとマップitemsの両方が同じ配列を参照しています。これはすべてのJS参照型の典型的な動作です。 mがプリミティブ型(例えば文字列)の値をマップしている場合は、setをマップ内で更新する必要があります。

+0

プッシュメソッドについては言及していませんが、それ以降のmap.get()については合意しました。明示的にm.set( 'items'、["a"、 "b" "c"、 "d"])と言っていることなく、 'd'値はマップキーと値のペア 'items'にどのように含まれましたか? – mhakes

+0

@mhakes配列はオブジェクトなので、このマップに格納されているものはこのオブジェクトへの参照です。これは特に地図とは関係がありませんが、JSの一般的な仕組みとは関係ありません。 – estus

+0

@EranSchと@estusはどちらも同じことを言っています。あなたが正しいのは、マップがクラスのように振る舞い、呼び出されない限り起動しない、 'class like'も考えていた、基本的なJSの動作です。呼び出しは参照の正しい用語ではなく、本来のものです。 – mhakes

関連する問題