回答編集履歴

1

平易な解説に書き換え

2018/02/07 02:35

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -16,19 +16,23 @@
16
16
 
17
17
 
18
18
 
19
- JavaScriptの世界ではArrayやObject等は生成時に`唯一の目に見えないID(以下ユニークID)`が割り振られて管理されています。
19
+ JavaScriptの世界ではArrayやObject等は生成時に`唯一の目に見えないID(以下ユニークID)`が与えられます。
20
20
 
21
+ ユニークIDの実体はオブジェクトが格納されているメモリ空間上のアドレスです。
22
+
21
- ユニークIDが一致している限り同じメモリ空間上に出来たただ一のオブジェトを参照してると考えください。
23
+ `var a = [100]`には配列実体そのものではなく、メモリ空間上のアドレス、まりユニーIDとう特殊な数値が代入されています
22
24
 
23
25
 
24
26
 
25
- `[100] === [100]`は`[100]`という配列を2個生成して、
27
+ `[100] === [100]`は`[100]`という配列を2個生成して、それぞれにユニークIDを割り振ります。
26
28
 
29
+ オブジェクト同士の比較演算では、このユニークID同士のみを比較します。
30
+
27
- ユニークID同士を比較する結果が`false`になるのです。
31
+ ユニークID以外は完全に一致する2つの`[100]`ですがユニークID異なる為に`false`になるのです。
28
32
 
29
33
 
30
34
 
31
- 今回説明している「ユニークIDという単語一般的な名ではありません、`メモリ空間のアドレス`がより正しい呼び名で
35
+ ※ユニークIDと連呼してますが、これ説明し易いから呼んでいるだけで正式な名ではありません。この回答文以外ではメモリ空間のアドレス等の呼んで下さい。
32
36
 
33
37
 
34
38
 
@@ -56,7 +60,7 @@
56
60
 
57
61
  c[0] = 3;
58
62
 
59
- console.log(b, c); // [3], [3] <- !?!?!?
63
+ console.log(a, b, c); // [2], [3], [3] <- !?!?!?
60
64
 
61
65
  ```
62
66
 
@@ -65,6 +69,10 @@
65
69
  配列やオブジェクトの値を操作する場合、ユニークIDに従ってメモリ空間上にある値を直接更新します。
66
70
 
67
71
  その結果、上記のコードでは`c[0]`の変更の影響が`b[0]`に出ています。
72
+
73
+
74
+
75
+ ちなみにaとbは別々に配列を作っていますので相互不干渉です。
68
76
 
69
77
 
70
78
 
@@ -114,6 +122,20 @@
114
122
 
115
123
 
116
124
 
117
- 他にも様な手法があります
125
+ aとbは別の配列を作る宣言をしていますのでユニークIDは別個です。
118
126
 
127
+ その後a配列の要素を一つずつbにコピーしていますが、
128
+
129
+ aとbは既に切り離されていますし、a配列の要素は全て数値なのでユニークIDのコピーは発生しません。
130
+
131
+
132
+
133
+ bはaのクローンを作る事に成功したのです。
134
+
135
+ 従って、a配列には影響を与えずに`b[0] = 10`と意図通りの操作を行う事に成功しています。
136
+
137
+
138
+
139
+ この手法は「シャローコピー」、「ディープコピー」、「クローン」などといった用語で説明されています。
140
+
119
- もし必要になればシャロコピーやディープコピーといった単語で検索てみてください。
141
+ もし必要になった際には、こらのワで検索を掛けてみてください。