回答編集履歴
1
校生
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
|
-
|
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: "
|
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
|
```
|