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

回答編集履歴

5

参照を持つ値

2021/01/17 16:55

投稿

think49
think49

スコア18194

answer CHANGED
@@ -181,8 +181,8 @@
181
181
 
182
182
  現在のJavaScript(ES2020)は「値渡し」しか出来ない為、このような機能は実現できません。
183
183
 
184
- なお、本回答で「参照値」と表現したのは「**同じ参照を持つ値**」という意味です。
184
+ なお、本回答で「参照値」と表現したのは「**参照を持つ値**」という意味です。
185
- 同じ参照を持つからこそプロパティ書き換えはお互いに影響しあいますが、**再代入すると別の値に変わる**ので、同じ参照を持たなくなります。
185
+ 同じ参照を持つ値」を代入すればプロパティ書き換えはお互いに影響しあいますが、**再代入すると別の値に変わる**ので、同じ参照を持たなくなります。
186
186
  参照渡しならば、再代入時に**参照先が再代入される**ので、どんな場合でも完全に同一になります。
187
187
 
188
188
  Re: kyskgsh さん

4

参照渡し

2021/01/17 16:55

投稿

think49
think49

スコア18194

answer CHANGED
@@ -146,4 +146,43 @@
146
146
  console.log(obj3, obj4); // {x: 1} {x: 1}
147
147
  ```
148
148
 
149
+ ### 参照渡し
150
+
151
+ 違いを認識するには「参照渡し」の概念を先に理解する必要があると思います。
152
+
153
+ - [PHP: リファレンス渡し - Manual](https://www.php.net/manual/ja/language.references.pass.php)
154
+
155
+ 「参照」とは「Windowsのショートカットファイル」「Linuxのエイリアス」のようなものです。
156
+
157
+ - [富士通Q&A - [Windows 10] デスクトップにショートカットアイコンを作成する方法を教えてください。 - FMVサポート : 富士通パソコン](https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=2910-7979)
158
+ - [エイリアス | Linux技術者認定 LinuC | LPI-Japan](https://linuc.org/study/knowledge/354/)
159
+
160
+ **もしも、JavaScriptでPHPの参照渡しが使えたならば**、次の結果になったはずです。
161
+
162
+ ```JavaScript
163
+ let obj5 = {};
164
+ let obj6 = &obj5; // 参照渡しされるものと仮定する
165
+ obj6 = null;
166
+ console.log(obj5 === obj6); // true
167
+ console.log(obj5, obj6); // null null
168
+ ```
169
+
170
+ `obj6` は `obj5` の「参照」なので、`obj6` を参照する時、それは `obj5` への参照として扱われます。
171
+
172
+ ```JavaScript
173
+ obj6 = null;
174
+ ```
175
+
176
+ つまり、上記コードは下記コードと等価です(逆もしかり)。
177
+
178
+ ```JavaScript
179
+ obj5 = null;
180
+ ```
181
+
182
+ 現在のJavaScript(ES2020)は「値渡し」しか出来ない為、このような機能は実現できません。
183
+
184
+ なお、本回答で「参照値」と表現したのは「**同じ参照を持つ値**」という意味です。
185
+ 同じ参照を持つからこそプロパティ書き換えはお互いに影響しあいますが、**再代入すると別の値に変わる**ので、同じ参照を持たなくなります。
186
+ 参照渡しならば、再代入時に**参照先が再代入される**ので、どんな場合でも完全に同一になります。
187
+
149
188
  Re: kyskgsh さん

3

(通称)

2021/01/17 14:47

投稿

think49
think49

スコア18194

answer CHANGED
@@ -121,11 +121,10 @@
121
121
 
122
122
  意味を考えて命名することで思考が整理され、無駄なコードを書かずにすみます。
123
123
 
124
- ### 参照の値渡し
124
+ ### 参照の値渡し(通称)
125
125
 
126
126
  > 「参照渡し」、理解致しました。
127
127
 
128
- 厳密には、JavaScriptにおいては**全てが値渡し**です。
129
128
  Object型(参照型)には、変数に再代入された際に参照元にも再代入値を反映する「参照渡し」の性質がありません。
130
129
 
131
130
  ```JavaScript
@@ -136,7 +135,8 @@
136
135
  console.log(obj1, obj2); // {} null
137
136
  ```
138
137
 
139
- オブジェクトのプロパティ書き換え時に参照元に反映する性質は「参照の値渡し」または「共有渡し」のように表現、「参照渡し」と区別されています。
138
+ オブジェクトのプロパティ書き換え時に参照元に反映する性質は「参照の値渡し」または「共有渡し」のように表現されることがあり、「参照渡し」と区別されています。
139
+ (※「~渡し」は[ES2020](https://www.262.ecma-international.org/11.0/index.html)仕様に存在しない用語であり、あくまでも説明の為の便宜上の言葉です。標準的な用語ではありません。)
140
140
 
141
141
  ```JavaScript
142
142
  let obj3 = {}, obj4 = obj1;

2

参照の値渡し

2021/01/17 11:31

投稿

think49
think49

スコア18194

answer CHANGED
@@ -121,4 +121,29 @@
121
121
 
122
122
  意味を考えて命名することで思考が整理され、無駄なコードを書かずにすみます。
123
123
 
124
+ ### 参照の値渡し
125
+
126
+ > 「参照渡し」、理解致しました。
127
+
128
+ 厳密には、JavaScriptにおいては**全てが値渡し**です。
129
+ Object型(参照型)には、変数に再代入された際に参照元にも再代入値を反映する「参照渡し」の性質がありません。
130
+
131
+ ```JavaScript
132
+ let obj1 = {}, obj2 = obj1;
133
+
134
+ obj2 = null;
135
+ console.log(obj1 === obj2); // false
136
+ console.log(obj1, obj2); // {} null
137
+ ```
138
+
139
+ オブジェクトのプロパティ書き換え時に参照元に反映する性質は「参照の値渡し」または「共有渡し」のように表現し、「参照渡し」と区別されています。
140
+
141
+ ```JavaScript
142
+ let obj3 = {}, obj4 = obj1;
143
+
144
+ obj3.x = 1;
145
+ console.log(obj3 === obj4); // true
146
+ console.log(obj3, obj4); // {x: 1} {x: 1}
147
+ ```
148
+
124
149
  Re: kyskgsh さん

1

コメントの微修正

2021/01/17 11:17

投稿

think49
think49

スコア18194

answer CHANGED
@@ -20,7 +20,7 @@
20
20
  'use strict';
21
21
  class Player {
22
22
  moveX (xDirection) {
23
- const currentPoint = Object.assign({}, this.defaultPoint);
23
+ const currentPoint = Object.assign({}, this.defaultPoint); // シャローコピー
24
24
 
25
25
  switch (xDirection) {
26
26
  case 1:
@@ -54,7 +54,7 @@
54
54
  }
55
55
  }
56
56
 
57
- Object.defineProperty(Player.prototype, 'defaultPoint', { // 初期は固定の為、[[Prototype]] 上に保存しておく
57
+ Object.defineProperty(Player.prototype, 'defaultPoint', { // 初期座標は固定の為、[[Prototype]] 上に保存しておく
58
58
  enumerable: true,
59
59
  value: {x: 0, y: 0}
60
60
  });