回答編集履歴

5

参照を持つ値

2021/01/17 16:55

投稿

think49
think49

スコア18189

test CHANGED
@@ -364,9 +364,9 @@
364
364
 
365
365
 
366
366
 
367
- なお、本回答で「参照値」と表現したのは「**同じ参照を持つ値**」という意味です。
367
+ なお、本回答で「参照値」と表現したのは「**参照を持つ値**」という意味です。
368
-
368
+
369
- 同じ参照を持つからこそプロパティ書き換えはお互いに影響しあいますが、**再代入すると別の値に変わる**ので、同じ参照を持たなくなります。
369
+ 同じ参照を持つ値」を代入すればプロパティ書き換えはお互いに影響しあいますが、**再代入すると別の値に変わる**ので、同じ参照を持たなくなります。
370
370
 
371
371
  参照渡しならば、再代入時に**参照先が再代入される**ので、どんな場合でも完全に同一になります。
372
372
 

4

参照渡し

2021/01/17 16:55

投稿

think49
think49

スコア18189

test CHANGED
@@ -294,4 +294,82 @@
294
294
 
295
295
 
296
296
 
297
+ ### 参照渡し
298
+
299
+
300
+
301
+ 違いを認識するには「参照渡し」の概念を先に理解する必要があると思います。
302
+
303
+
304
+
305
+ - [PHP: リファレンス渡し - Manual](https://www.php.net/manual/ja/language.references.pass.php)
306
+
307
+
308
+
309
+ 「参照」とは「Windowsのショートカットファイル」「Linuxのエイリアス」のようなものです。
310
+
311
+
312
+
313
+ - [富士通Q&A - [Windows 10] デスクトップにショートカットアイコンを作成する方法を教えてください。 - FMVサポート : 富士通パソコン](https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=2910-7979)
314
+
315
+ - [エイリアス | Linux技術者認定 LinuC | LPI-Japan](https://linuc.org/study/knowledge/354/)
316
+
317
+
318
+
319
+ **もしも、JavaScriptでPHPの参照渡しが使えたならば**、次の結果になったはずです。
320
+
321
+
322
+
323
+ ```JavaScript
324
+
325
+ let obj5 = {};
326
+
327
+ let obj6 = &obj5; // 参照渡しされるものと仮定する
328
+
329
+ obj6 = null;
330
+
331
+ console.log(obj5 === obj6); // true
332
+
333
+ console.log(obj5, obj6); // null null
334
+
335
+ ```
336
+
337
+
338
+
339
+ `obj6` は `obj5` の「参照」なので、`obj6` を参照する時、それは `obj5` への参照として扱われます。
340
+
341
+
342
+
343
+ ```JavaScript
344
+
345
+ obj6 = null;
346
+
347
+ ```
348
+
349
+
350
+
351
+ つまり、上記コードは下記コードと等価です(逆もしかり)。
352
+
353
+
354
+
355
+ ```JavaScript
356
+
357
+ obj5 = null;
358
+
359
+ ```
360
+
361
+
362
+
363
+ 現在のJavaScript(ES2020)は「値渡し」しか出来ない為、このような機能は実現できません。
364
+
365
+
366
+
367
+ なお、本回答で「参照値」と表現したのは「**同じ参照を持つ値**」という意味です。
368
+
369
+ 同じ参照を持つからこそプロパティ書き換えはお互いに影響しあいますが、**再代入すると別の値に変わる**ので、同じ参照を持たなくなります。
370
+
371
+ 参照渡しならば、再代入時に**参照先が再代入される**ので、どんな場合でも完全に同一になります。
372
+
373
+
374
+
297
375
  Re: kyskgsh さん

3

(通称)

2021/01/17 14:47

投稿

think49
think49

スコア18189

test CHANGED
@@ -244,7 +244,7 @@
244
244
 
245
245
 
246
246
 
247
- ### 参照の値渡し
247
+ ### 参照の値渡し(通称)
248
248
 
249
249
 
250
250
 
@@ -252,8 +252,6 @@
252
252
 
253
253
 
254
254
 
255
- 厳密には、JavaScriptにおいては**全てが値渡し**です。
256
-
257
255
  Object型(参照型)には、変数に再代入された際に参照元にも再代入値を反映する「参照渡し」の性質がありません。
258
256
 
259
257
 
@@ -274,7 +272,9 @@
274
272
 
275
273
 
276
274
 
277
- オブジェクトのプロパティ書き換え時に参照元に反映する性質は「参照の値渡し」または「共有渡し」のように表現、「参照渡し」と区別されています。
275
+ オブジェクトのプロパティ書き換え時に参照元に反映する性質は「参照の値渡し」または「共有渡し」のように表現されることがあり、「参照渡し」と区別されています。
276
+
277
+ (※「~渡し」は[ES2020](https://www.262.ecma-international.org/11.0/index.html)仕様に存在しない用語であり、あくまでも説明の為の便宜上の言葉です。標準的な用語ではありません。)
278
278
 
279
279
 
280
280
 

2

参照の値渡し

2021/01/17 11:31

投稿

think49
think49

スコア18189

test CHANGED
@@ -244,4 +244,54 @@
244
244
 
245
245
 
246
246
 
247
+ ### 参照の値渡し
248
+
249
+
250
+
251
+ > 「参照渡し」、理解致しました。
252
+
253
+
254
+
255
+ 厳密には、JavaScriptにおいては**全てが値渡し**です。
256
+
257
+ Object型(参照型)には、変数に再代入された際に参照元にも再代入値を反映する「参照渡し」の性質がありません。
258
+
259
+
260
+
261
+ ```JavaScript
262
+
263
+ let obj1 = {}, obj2 = obj1;
264
+
265
+
266
+
267
+ obj2 = null;
268
+
269
+ console.log(obj1 === obj2); // false
270
+
271
+ console.log(obj1, obj2); // {} null
272
+
273
+ ```
274
+
275
+
276
+
277
+ オブジェクトのプロパティ書き換え時に参照元に反映する性質は「参照の値渡し」または「共有渡し」のように表現し、「参照渡し」と区別されています。
278
+
279
+
280
+
281
+ ```JavaScript
282
+
283
+ let obj3 = {}, obj4 = obj1;
284
+
285
+
286
+
287
+ obj3.x = 1;
288
+
289
+ console.log(obj3 === obj4); // true
290
+
291
+ console.log(obj3, obj4); // {x: 1} {x: 1}
292
+
293
+ ```
294
+
295
+
296
+
247
297
  Re: kyskgsh さん

1

コメントの微修正

2021/01/17 11:17

投稿

think49
think49

スコア18189

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
  moveX (xDirection) {
44
44
 
45
- const currentPoint = Object.assign({}, this.defaultPoint);
45
+ const currentPoint = Object.assign({}, this.defaultPoint); // シャローコピー
46
46
 
47
47
 
48
48
 
@@ -110,7 +110,7 @@
110
110
 
111
111
 
112
112
 
113
- Object.defineProperty(Player.prototype, 'defaultPoint', { // 初期は固定の為、[[Prototype]] 上に保存しておく
113
+ Object.defineProperty(Player.prototype, 'defaultPoint', { // 初期座標は固定の為、[[Prototype]] 上に保存しておく
114
114
 
115
115
  enumerable: true,
116
116