@@ -36,4 +36,324 @@ const jsx_sugar = React.createElement(
36
36
- まだ標準化されていない機能を使いたいときなどにも使われる
37
37
38
38
#### 参考
39
- - https://zenn.dev/ken505/articles/9a2bb8dc766f5e
39
+ - https://zenn.dev/ken505/articles/9a2bb8dc766f5e
40
+
41
+ # JavaScript再履修
42
+ ## 関数とアロー関数
43
+ - JavaScriptでの関数は** 第一級オブジェクト**
44
+ - 第一級オブジェクト:あるプログラミング言語において、たとえば生成、代入、演算、(引数・戻り値としての)受け渡しといったその言語における基本的な操作を制限なしに使用できる対象のこと(from Wikipedia)
45
+ - 他にも変数など
46
+ - つまり,関数を変数に代入できたり,関数を戻り値にとれたり,関数の中に関数を宣言できる
47
+ - 関数の一例
48
+ - JavaScriptは,関数を` function ` キーワードで宣言できる
49
+ ``` js
50
+ function add (a , b ) {
51
+ return a + b;
52
+ }
53
+ add (1 ,2 ); // 3
54
+ ```
55
+ ### 無名関数
56
+ - 名前のない関数を宣言できる
57
+ ``` js
58
+ const add = function (a , b ) {
59
+ return a + b;
60
+ }
61
+ add (1 ,2 ); // 3
62
+ ```
63
+ - ここで,addは,無名関数を代入した変数
64
+
65
+ ### アロー関数
66
+ - アロー演算子を用いた関数
67
+ - ` function ` を用いた関数とは` this ` の示す先が異なるなど,ちょっと違う
68
+ - とはいえ,代替表現として捉えて良い
69
+ ``` js
70
+ const add = (a , b ) => {
71
+ return a + b;
72
+ }
73
+ add (1 ,2 ) // 3
74
+ ```
75
+ - ` return ` は省略できる
76
+ ``` js
77
+ const add = (a , b ) => a + b;
78
+ ```
79
+
80
+ - 括弧でくくってもよい
81
+ ``` js
82
+ const add = (a , b ) => (
83
+ a + b
84
+ );
85
+ ```
86
+
87
+ ### 関数を引数に取る
88
+ - 以下の例をみる
89
+ ``` js
90
+ function calc (f , a , b ) {
91
+ return f (a,b)
92
+ }
93
+
94
+ function add (a , b ) {
95
+ return a + b;
96
+ }
97
+
98
+ function times (a , b ) {
99
+ return a * b;
100
+ }
101
+
102
+ calc (add, 1 , 2 ); // 3
103
+ calc (times, 2 , 3 ); // 6
104
+ ```
105
+ - 無名関数を使ってこんなこともできる
106
+ ``` js
107
+ function calc (f , a , b ) {
108
+ return f (a, b);
109
+ }
110
+ calc ((a , b ) => (a + b), 1 , 2 ); // 3
111
+ ```
112
+ ### 内部関数
113
+ - 関数の中に宣言される関数
114
+ ``` js
115
+ function calc (a , b ) {
116
+ function add (a , b ) {
117
+ return a + b;
118
+ }
119
+
120
+ return add (a, b);
121
+ }
122
+ calc (1 , 2 ) // 3
123
+ ```
124
+ - 関数を戻り値にとることでこんなこともできる
125
+ ``` js
126
+ function outer (val1 ) {
127
+ function inner (val2 ) {
128
+ return val1 * val2;
129
+ }
130
+ return inner;
131
+ }
132
+
133
+ outer (3 )(4 ); // 12
134
+ ```
135
+ ## オブジェクト
136
+ - 「クラスとオブジェクト」のオブジェクトとは全くの別物
137
+ - keyとvalueからなるデータの集合
138
+ - Cでいえば構造体,Pythonでいえば辞書型,RubyでいえばHash型のこと
139
+
140
+ ### オブジェクトの宣言
141
+ ``` js
142
+ const vendingItem = {
143
+ name: ' Juice' ,
144
+ price: 300 ,
145
+ }
146
+ ```
147
+ - 最後のカンマはなくても良いが,つけたほうがGitの差分管理とかで有利
148
+ - キーと同名の変数を格納するときはvalueを省略できる
149
+ ``` js
150
+ const name = ' taro' ;
151
+ const age = 21 ;
152
+
153
+ const user = {
154
+ name,
155
+ age,
156
+ }
157
+ ```
158
+ ### オブジェクトの呼び出し
159
+ - 2通りある
160
+ ``` js
161
+ console .log (vendingItem .name );
162
+ console .log (vendingItem[' name' ])
163
+ ```
164
+ - 前者はドット記法
165
+ - 一番ポピュラー(な気がする)
166
+ - 後者はブラケット記法
167
+ - ブラケット記法は,キー指定に変数を取れる
168
+ ``` js
169
+ const key = ' name' ;
170
+ console .log (vendingItem[name]);
171
+ ```
172
+
173
+ ### オブジェクトと定数
174
+ - オブジェクトを定数として宣言できるが,valueの変更ができてしまう
175
+ - オブジェクトの実体はアドレスであるため
176
+ - 再代入はできない
177
+ - 代入はシャローコピー
178
+ ``` js
179
+ const obj1 = {
180
+ name: ' taro' ,
181
+ };
182
+ const obj2 = obj1; // シャローコピー
183
+ obj2 .name = ' kotaro' ; // 可能
184
+
185
+ // これはできない
186
+ obj2 = {
187
+ name: ' suzuki' ,
188
+ }
189
+ ```
190
+
191
+ ### オブジェクトの等価性
192
+ - 上述の通り,オブジェクトの実体はアドレスであるため,valueを変えても等価判定はできない
193
+ ``` js
194
+ const obj1 = {
195
+ name: ' taro'
196
+ };
197
+ const obj2 = obj1;
198
+
199
+ obj2 .name = ' kotaro' ;
200
+ console .log (obj1 == obj2); // true
201
+ ```
202
+ - valueを含めた判定には,Object.jsといったライブラリを用いるのがよい
203
+
204
+ ### オブジェクトと関数
205
+ - 関数の引数にオブジェクトを使うことで,名前付き引数を実現できる
206
+ ``` js
207
+ function greeting (greetingProps ) {
208
+ const name = greetingProps .name ;
209
+ return ' Hello, ' + name + ' !!' ;
210
+ }
211
+
212
+ greeting ({ name: ' Taro' });
213
+ ```
214
+
215
+ ## 配列と配列操作関数
216
+ - 配列はオブジェクトの特殊な形
217
+ - 基本的には上述のオブジェクトと同様な性質を持つ
218
+ - 等価判定は難しい
219
+ - 代入はシャローコピー
220
+ ``` js
221
+ const arr = [1 , 2 , 3 ];
222
+ a[0 ] // 1
223
+ ```
224
+ ### さまざまな配列
225
+ - オブジェクトの配列を作ることができる
226
+ ``` js
227
+ const users = [
228
+ { name: ' Taro' , age: 20 , gender: ' male' },
229
+ { name: ' Lisa' , age: 19 , gender: ' female' },
230
+ { name: ' Kojiro' , age: 21 , gender: ' male' },
231
+ ]
232
+ ```
233
+ - 配列に関数を代入できる
234
+ - JavaScriptの配列は複数の型を混在できる
235
+ ``` js
236
+ const add = (a , b ) => a + b;
237
+ const sub = (a , b ) => a - b;
238
+ const times = (a , b ) => a * b;
239
+ const divide = (a , b ) => a / b;
240
+
241
+ const calcs = [
242
+ add,
243
+ sub,
244
+ times,
245
+ divide,
246
+ ];
247
+ ```
248
+ ### 関数型プログラミングに便利な関数群
249
+ #### map関数
250
+ - 配列の各要素に対して然るべき処理を与え,新たな配列を返す関数
251
+ - 以下は配列の各要素を2乗する処理
252
+ ``` js
253
+ const arr = [ 1 , 2 , 3 ];
254
+ const square = arr .map ((a ) => a * a);
255
+ ```
256
+ - map関数はReactでよく用いる
257
+ - JSX内のfor文のかわりなど
258
+ #### filter関数
259
+ - 配列の各要素に対して,条件文にマッチする要素のみの新たな配列を返す関数
260
+ ``` js
261
+ const arr = [1 , 2 , 3 , 4 , 5 ];
262
+ const over3 = arr .filter (a => a >= 3 );
263
+ ```
264
+ #### reduce関数
265
+ - 配列の各要素から,新たな値を出力する関数
266
+ ``` js
267
+ const arr = [1 , 2 , 3 , 4 , 5 ];
268
+ const sum = arr .reduce ((summing , a ) => summing + a, 0 );
269
+ ```
270
+ - 無名関数の第一引数には,最新の値が入る
271
+ - ここでは,足し合わせている過程である
272
+ - 第二引数には,配列の要素それぞれが入る
273
+ - reduce関数の第二引数は初期値である.
274
+
275
+ ## 分割代入
276
+ - オブジェクトからの宣言で,キーをそのまま取り出すことができる
277
+ - 呼び出す順番は任意
278
+ - キー名を指定する必要
279
+ - 別名の利用もできる
280
+ ``` js
281
+ const obj = {
282
+ name: ' Taro' ,
283
+ age: 40 ,
284
+ }
285
+
286
+ const { age , name } = obj;
287
+ const { age: taroAge , name: taroName } = obj;
288
+ console .log (name, age); // Taro, 40
289
+ console .log (taroName, taroAge); // Taro, 40
290
+ ```
291
+ - これを関数宣言に応用できる
292
+ ``` js
293
+ function greeting ({ name }) {
294
+ return ' Hello, ' + name + ' !!' ;
295
+ }
296
+ greeting ({ name: ' Taro' });
297
+ ```
298
+ - 配列でも同様
299
+ - ただし,順番が意識される
300
+ - 別名で呼び出せる
301
+ ``` js
302
+ const add = (a , b ) => a + b;
303
+ const sub = (a , b ) => a - b;
304
+ const times = (a , b ) => a * b;
305
+ const divide = (a , b ) => a / b;
306
+
307
+ const calcs = [
308
+ add,
309
+ sub,
310
+ times,
311
+ divide,
312
+ ];
313
+
314
+ const [ addnew , subnew ] = cals;
315
+ ```
316
+
317
+ ### スプレッド構文
318
+ - 3つのドットを用いた記法
319
+ - オブジェクトや配列の中身を展開する
320
+ - いろんな使い方ができる
321
+ #### 配列の結合
322
+ ``` js
323
+ const progLang = [ " C" , " Ruby" , " JavaScript" , " Java" ];
324
+ const naturalLang = [ " Japanese" , " English" , " Chinese" ];
325
+ const lang = [ ... progLang, ... naturalLang ];
326
+ ```
327
+ #### ディープコピー
328
+ ``` js
329
+ const obj = {
330
+ name: ' Taro' ,
331
+ age: 20 ,
332
+ };
333
+
334
+ const obj_copy = { ... obj };
335
+ ```
336
+
337
+ #### 残余引数
338
+ ``` js
339
+ const progLang = [ " C" , " Ruby" , " JavaScript" , " Java" ];
340
+
341
+ const [ first , ... others ] = progLang;
342
+
343
+ console .log (other .join (' , ' )); // Ruby, JavaScript, Java
344
+ ```
345
+
346
+ ## テンプレート文字列
347
+ - 変数を埋め込むことのできる文字列
348
+ ``` js
349
+ const name = ' Taro' ;
350
+ const greeting = ` Hello, ${ name} !` ;
351
+ console .log (greeting); // Hello, Taro!
352
+ ```
353
+
354
+ ## 三項演算子
355
+ - みんな大好き三項演算子
356
+ - ` 条件文 ? 正のときの値 : 負のときの値 ` で与えられる
357
+ - Reactではif文のかわりとして多用する
358
+
359
+ ## ESモジュール
0 commit comments