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

回答編集履歴

2

おまけのタイトルを変更

2018/04/26 09:35

投稿

miyabi-sun
miyabi-sun

スコア21542

answer CHANGED
@@ -55,12 +55,16 @@
55
55
 
56
56
  ---
57
57
 
58
- おまけ: これが模範解答になる所以
58
+ おまけ: valueOfプロパティの効果
59
59
 
60
- 定義が`add(1)(2)(3)`…と無限に関数を返し続ける関数である必要があります。
60
+ 命題が`add(1)(2)(3)`…と無限にチェーン出来るという事は、関数を返し続ける関数である必要があります。
61
+ じゃあ値を取り出したくなってもよくわかんないよね…
61
- JavaScriptインスタンス化されたオブジェクト等、
62
+ 今回の模範解答たまたまvalueOfが宣言されていのだけど……
62
- Stringとして表せられないものには大抵`valueOf`というメソッドが用意されており何時でも値に変換出来るようにするという慣習があります。
63
63
 
64
+ JavaScriptにはインスタンス化されたオブジェクト等、
65
+ Stringとして表せられないものには大抵`valueOf`というメソッドが用意されており
66
+ 何時でも値に変換出来るようにするというルールがあります。
67
+
64
68
  ```JavaScript
65
69
  function add(n){
66
70
  var fn = function(x) {
@@ -79,10 +83,34 @@
79
83
 
80
84
  // 足し算すると普通にNumber型っぽく計算に使える!?
81
85
  console.log(10 + add(1)(2)(3)) // 16
86
+
87
+ // valueOfがあればなんでもいけんの?じゃあこれは?
88
+ console.log(10 + {
89
+ name: 'taro',
90
+ age: 17,
91
+ valueOf: function(){ return this.age }
92
+ })
93
+ // 27
94
+
95
+ // 配列とかどうすんだ?
96
+ var arr = [1, 2, 3];
97
+ arr.valueOf = function(){
98
+ var sum = 0
99
+ for (var i = 0; i < this.length; i++) {
100
+ sum += this[i]
101
+ }
102
+ return sum
103
+ }
104
+ console.log(10 + arr) // 16
82
105
  ```
83
106
 
84
107
  こういう効果があります。
85
108
  この辺も含めると、質問文のコードは模範解答となるのは間違いないでしょう。
86
109
 
110
+ ただ、`add(1)(2)`の結果が3という元ネタサイトの記述は違和感がありますけどね。
111
+ まぁconsole.logを使って「f 3」と表示されるのはChromeの機能であり
112
+ Node.jsや別のブラウザでconsole.logに放り込めばそのまま3と表示される可能性はあります。
113
+ (Node.jsでは`{ [Function: fn] valueOf: [Function] }`と表示されて全然駄目ですが)
114
+
87
- まぁ、問題の関数を返し続ける関数の時点でかなりイレギュラーなすけどね。
115
+ 問題の関数を返し続ける関数の時点でかなりイレギュラーな問題したね。
88
- 頭の体操としては楽しい問題だと思いますし、コードに深みが出る良い問題&模範解答だと思います。
116
+ でも頭の体操としては楽しい問題だと思いますし、コードに深みが出る良い問題&模範解答だと思います。

1

おまけ追加

2018/04/26 09:35

投稿

miyabi-sun
miyabi-sun

スコア21542

answer CHANGED
@@ -51,4 +51,38 @@
51
51
  // function
52
52
  console.log(add(1)(2)(5).valueOf());
53
53
  // 8
54
- ```
54
+ ```
55
+
56
+ ---
57
+
58
+ おまけ: これが模範解答になる所以
59
+
60
+ 定義が`add(1)(2)(3)`…と無限に関数を返し続ける関数である必要があります。
61
+ JavaScriptはインスタンス化されたオブジェクト等、
62
+ Stringとして表せられないものには大抵`valueOf`というメソッドが用意されており何時でも値に変換出来るようにするという慣習があります。
63
+
64
+ ```JavaScript
65
+ function add(n){
66
+ var fn = function(x) {
67
+ return add(n + x);
68
+ };
69
+
70
+ fn.valueOf = function() {
71
+ return n;
72
+ };
73
+
74
+ return fn;
75
+ }
76
+
77
+ // console.logしたらf 6が表示されるけどなんだ?
78
+ console.log(add(1)(2)(3)) // f 6
79
+
80
+ // 足し算すると普通にNumber型っぽく計算に使える!?
81
+ console.log(10 + add(1)(2)(3)) // 16
82
+ ```
83
+
84
+ こういう効果があります。
85
+ この辺も含めると、質問文のコードは模範解答となるのは間違いないでしょう。
86
+
87
+ まぁ、問題の関数を返し続ける関数の時点でかなりイレギュラーなんですけどね。
88
+ 頭の体操としては楽しい問題だと思いますし、コードに深みが出る良い問題&模範解答だと思います。