node.js(v10.14.2)
for (var [key, value] of map)
でmap(Map)の要素について処理を行う際に、valueが数値などの場合はvalue += 1;
のように変更しても元のMapであるmapは変更されていないのに対して、valueがオブジェクトであり、そのプロパティについて変更をした場合にmapの内容まで変更されているのはなぜでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
for (var [key, value] of map)
のようにした場合、value
の値は、ふつうの代入と同じように処理されています。value
を書き換えても元のmap
そのものは変化しません。
value += 1;
のように再代入を行った場合、value
の変数が書き換わるだけです。- 「valueがオブジェクトであり、そのプロパティについて変更をした場合」は、オブジェクトは
map
の中身もvalue
にあるものも共通なので、map
から参照しても変化は確認できます。
投稿2020/07/27 02:18
総合スコア146018
0
ベストアンサー
JavaScriptには2タイプの値が存在し、
プリミティブとオブジェクトです。
どちらを代入するかで動きが変わります。
直感に反して変な動きをするオブジェクトに関して解説していきます。
プリミティブ値はMDNのサイトを見るか、コンソール上であれこれ挙動を確認してみてください。
js
1const user = {name: "taro"}
こういうコードがあった場合、
{name: "taro"}
というオブジェクトをメモリ空間上に作成します。
仮にそのアドレス値がABABAB
だったとしましょう。
そしてuser
変数を宣言しますが、
その変数にはABABAB
といった感じのアドレス値が格納されます。
オブジェクト同士の比較を行う場合、
アドレス値が一致するか否かの比較になりますし、
プロパティの操作はアドレス値を元にメモリ空間に存在する実データのアクセスとなります。
なので下記のような動きになります。
ブラウザ上からF12キーで呼び出せるConsole上での動作を踏まえて説明していきます。
// userにアドレス値ABABABを格納 > user = {name: "taro"} {name: "taro"} // 新しく作ったオブジェクトに対して即席のアドレス値ACACACが払い出される // 比較するとアドレス値ABABABとACACACの比較になり結果はfalse > user == {name: "taro"} false // オブジェクト系なら他の比較も同様 // 2個のアドレスを払い出しての比較になり結果は必ずfalse > ["abc"] == ["abc"] false // user2にアドレス値ABABABをコピー // 閲覧しているメモリ空間のオブジェクトは同一 > user2 = user {name: "taro"} // アドレス値ABABAB同士で比較するとtrueになる > user == user2 true // アドレス値ABABABのオブジェクトのnameを変更 > user2.name = "jiro" // アドレス値ABABABのオブジェクトのnameはjiroに変更されている // user.nameでチェックすると当然変化済 > user {name: "jiro"} // 新しいオブジェクト(アドレス値ADADAD)を生成してアドレス値を保存 > user = {name: "saburo"} {name: "saburo"} // 変数user2はアドレス値ABABABが格納されたままなので変更されない > user2 {name: "jiro"}
投稿2020/07/27 08:03
総合スコア21203
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
nodeはよくわからないので一般的な話ですが
数値や文字列リテラルを受けた変数は元の値に影響しませんが
オブジェクトを受けた変数は根本的に参照するものが同じなので
参照渡しのような挙動をするのがjsの基本だからじゃないですかね
投稿2020/07/27 02:21
総合スコア116734
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/28 01:26