回答編集履歴
5
参照を持つ値
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
参照渡し
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
(通称)
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
参照の値渡し
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
コメントの微修正
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', { // 初期
|
57
|
+
Object.defineProperty(Player.prototype, 'defaultPoint', { // 初期座標は固定の為、[[Prototype]] 上に保存しておく
|
58
58
|
enumerable: true,
|
59
59
|
value: {x: 0, y: 0}
|
60
60
|
});
|