回答編集履歴

2

おまけのタイトルを変更

2018/04/26 09:35

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -112,15 +112,23 @@
112
112
 
113
113
 
114
114
 
115
- おまけ: これが模範解答になる所以
115
+ おまけ: valueOfプロパティの効果
116
-
117
-
118
-
116
+
117
+
118
+
119
- 定義が`add(1)(2)(3)`…と無限に関数を返し続ける関数である必要があります。
119
+ 命題が`add(1)(2)(3)`…と無限にチェーン出来るという事は、関数を返し続ける関数である必要があります。
120
+
120
-
121
+ じゃあ値を取り出したくなってもよくわかんないよね…
122
+
123
+ 今回の模範解答はたまたまvalueOfが宣言されていたのだけど……
124
+
125
+
126
+
121
- JavaScriptはインスタンス化されたオブジェクト等、
127
+ JavaScriptはインスタンス化されたオブジェクト等、
122
-
128
+
123
- Stringとして表せられないものには大抵`valueOf`というメソッドが用意されており何時でも値に変換出来るようにするという慣習があります。
129
+ Stringとして表せられないものには大抵`valueOf`というメソッドが用意されており
130
+
131
+ 何時でも値に変換出来るようにするというルールがあります。
124
132
 
125
133
 
126
134
 
@@ -160,6 +168,44 @@
160
168
 
161
169
  console.log(10 + add(1)(2)(3)) // 16
162
170
 
171
+
172
+
173
+ // valueOfがあればなんでもいけんの?じゃあこれは?
174
+
175
+ console.log(10 + {
176
+
177
+ name: 'taro',
178
+
179
+ age: 17,
180
+
181
+ valueOf: function(){ return this.age }
182
+
183
+ })
184
+
185
+ // 27
186
+
187
+
188
+
189
+ // 配列とかどうすんだ?
190
+
191
+ var arr = [1, 2, 3];
192
+
193
+ arr.valueOf = function(){
194
+
195
+ var sum = 0
196
+
197
+ for (var i = 0; i < this.length; i++) {
198
+
199
+ sum += this[i]
200
+
201
+ }
202
+
203
+ return sum
204
+
205
+ }
206
+
207
+ console.log(10 + arr) // 16
208
+
163
209
  ```
164
210
 
165
211
 
@@ -170,6 +216,16 @@
170
216
 
171
217
 
172
218
 
219
+ ただ、`add(1)(2)`の結果が3という元ネタサイトの記述は違和感がありますけどね。
220
+
221
+ まぁconsole.logを使って「f 3」と表示されるのはChromeの機能であり
222
+
223
+ Node.jsや別のブラウザでconsole.logに放り込めばそのまま3と表示される可能性はあります。
224
+
225
+ (Node.jsでは`{ [Function: fn] valueOf: [Function] }`と表示されて全然駄目ですが)
226
+
227
+
228
+
173
- まぁ、問題の関数を返し続ける関数の時点でかなりイレギュラーなすけどね。
229
+ 問題の関数を返し続ける関数の時点でかなりイレギュラーな問題したね。
174
-
230
+
175
- 頭の体操としては楽しい問題だと思いますし、コードに深みが出る良い問題&模範解答だと思います。
231
+ でも頭の体操としては楽しい問題だと思いますし、コードに深みが出る良い問題&模範解答だと思います。

1

おまけ追加

2018/04/26 09:35

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -105,3 +105,71 @@
105
105
  // 8
106
106
 
107
107
  ```
108
+
109
+
110
+
111
+ ---
112
+
113
+
114
+
115
+ おまけ: これが模範解答になる所以
116
+
117
+
118
+
119
+ 定義が`add(1)(2)(3)`…と無限に関数を返し続ける関数である必要があります。
120
+
121
+ JavaScriptはインスタンス化されたオブジェクト等、
122
+
123
+ Stringとして表せられないものには大抵`valueOf`というメソッドが用意されており何時でも値に変換出来るようにするという慣習があります。
124
+
125
+
126
+
127
+ ```JavaScript
128
+
129
+ function add(n){
130
+
131
+ var fn = function(x) {
132
+
133
+ return add(n + x);
134
+
135
+ };
136
+
137
+
138
+
139
+ fn.valueOf = function() {
140
+
141
+ return n;
142
+
143
+ };
144
+
145
+
146
+
147
+ return fn;
148
+
149
+ }
150
+
151
+
152
+
153
+ // console.logしたらf 6が表示されるけどなんだ?
154
+
155
+ console.log(add(1)(2)(3)) // f 6
156
+
157
+
158
+
159
+ // 足し算すると普通にNumber型っぽく計算に使える!?
160
+
161
+ console.log(10 + add(1)(2)(3)) // 16
162
+
163
+ ```
164
+
165
+
166
+
167
+ こういう効果があります。
168
+
169
+ この辺も含めると、質問文のコードは模範解答となるのは間違いないでしょう。
170
+
171
+
172
+
173
+ まぁ、問題の関数を返し続ける関数の時点でかなりイレギュラーなんですけどね。
174
+
175
+ 頭の体操としては楽しい問題だと思いますし、コードに深みが出る良い問題&模範解答だと思います。