teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

校生

2018/08/28 11:22

投稿

miyabi-sun
miyabi-sun

スコア21472

answer CHANGED
@@ -19,10 +19,6 @@
19
19
  変数にはメモリ空間上のアドレス番地が格納されることになります。
20
20
  なので下記のように`data2 = data;`とした場合、両者には同じメモリ空間上にあるオブジェクトを参照していることになります。
21
21
 
22
- これの恐ろしい所は、関数の引数として渡した先で、
23
- 引数のオブジェクトのプロパティの値を変えれば関数の呼び出し元でプロパティが変更されて
24
- としてオブジェクトを指定して渡した先でも勝手にオブジェクトが作り変えられてしまう事があるという点です。
25
-
26
22
  ```JavaScript
27
23
  var data = {name: "taro", age: 18};
28
24
  var data2 = data;
@@ -30,11 +26,25 @@
30
26
  console.log(data); // {name: "jiro", age: 18}
31
27
  ```
32
28
 
29
+ これの恐ろしい所は、関数の引数として渡した先で、
30
+ 引数のオブジェクトのプロパティの値を変えた場合、
33
- でdataには変更加えたくないんだけどなぁ…という時は下記よう使います。
31
+ 関数呼び出し元あったずのオブジェクトが知らぬ内に改されるという不具合原因なります。
34
32
 
33
+ dataには変更加えたくないんだけどなぁ…という時は下記のように使います。
34
+ こうしてコピーを取っておけば誰かが勝手にプロパティを書き換えても元のオブジェクトは変更されていないので安心ですね。
35
+
35
36
  ```JavaScript
36
37
  var data = {name: "taro", age: 18};
37
- var data2 = data;
38
+ var data2 = {...data};
38
39
  data2.name = "jiro";
39
- console.log(data); // {name: "jiro", age: 18}
40
+ console.log(data); // {name: "taro", age: 18}
41
+ ```
42
+
43
+ また、このコードならば下記のように簡略的な書き方も出来ます。
44
+ 2番目の使い方ですね。
45
+
46
+ ```JavaScript
47
+ var data = {name: "taro", age: 18};
48
+ var data2 = {...data, name: "jiro"};
49
+ console.log(data); // {name: "taro", age: 18}
40
50
  ```