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

回答編集履歴

1

おまけ追加

2021/12/28 06:24

投稿

miyabi-sun
miyabi-sun

スコア21461

answer CHANGED
@@ -28,10 +28,21 @@
28
28
  ```
29
29
  > let n1 = 1, n2 = 2
30
30
  undefined
31
+
31
32
  > n1
32
33
  1
34
+
33
35
  > n2
34
36
  2
37
+
38
+ # 代入だけなら値が取れる
39
+ > n1 = 10
40
+ 10
41
+
42
+ # カンマでくくりつつの複数代入は一番最後の値が取れる
43
+ # しかし変数宣言の目的は変数宣言なわけだし、微妙ではあるがおかしいというほどではなさそう
44
+ > n1 = 11, n2 = 12
45
+ 12
35
46
  ```
36
47
 
37
48
  続いて`console.log(number)`が`undefined`を返す理由についてです。
@@ -51,8 +62,11 @@
51
62
  > 6. Otherwise, perform Printer(logLevel, Formatter(args)).
52
63
  > **7. Return undefined.**
53
64
 
54
- ---
65
+ 仕様がundefinedを返しましょうって言ってるのに、
66
+ 勝手に入力値を返し始めたら「なんだこいつ!?」ってなってしまいます。
55
67
 
68
+ REPLではコマンドを打ち込むと、
69
+ 毎回結果を評価して画面出力してくれます。
56
70
  下記のようにしましょう。
57
71
 
58
72
  ```
@@ -62,4 +76,51 @@
62
76
  # REPLで値を確認する場合、変数単体や式を直接投げ込む
63
77
  > number
64
78
  1
79
+ ```
80
+
81
+ ---
82
+
83
+ 【おまけ】 console.logで値を返してほしい!
84
+
85
+ 関数型プログラミングをサポートするライブラリにそういうのあります。
86
+ 例えばJavaScriptやNode.jsでよく使われているLodashというライブラリ
87
+ [tap - Lodash](https://lodash.com/docs/4.17.15#tap)
88
+
89
+ [Online Lodash Tester](https://codepen.io/travist/full/jrBjBz/)
90
+ このサイトで実際に使ってみます。
91
+
92
+ ```js
93
+ result = _.tap(123, console.log)
94
+ // 123
95
+ ```
96
+
97
+ このときのtapはこういう感じの関数になっています。
98
+
99
+ ```js
100
+ function tap (value, callback) {
101
+ callback(value);
102
+ return value;
103
+ }
104
+
105
+ > tap(123, console.log);
106
+ 123
107
+ 123
108
+ ```
109
+
110
+ 実行結果捨てて、改めて入力値返してるんだから
111
+ そりゃそうなるわなという感じなんですけどね。
112
+
113
+ 例えばLodashでは[チェーン記法](https://qiita.com/kurararara/items/fb470ea71e59cd0371d4)を使うことで複雑な値の加工もほんの数行で完了させることができます。
114
+
115
+ ただし、複雑なことをメソッドチェーンでやるわけで、
116
+ 途中の値どうなってんねん?って知りたいという動機があるわけです。
117
+ でも`console.log`を通過させると値が`undefined`に変異してしまう。
118
+ こういう時に`.tap(console.log)`を挟んで画面出力させつつロジックの処理は途切れさせないということができます。
119
+
120
+ ```js
121
+ _(users)
122
+ .filter(function(user) { return user.age > 35; })
123
+ .tap(console.log) // この時点での値はどうなってるんだい?
124
+ .pick('name')
125
+ .value();
65
126
  ```