Skip to content

Commit 921c0fd

Browse files
committed
2日目wip
1 parent ef27df0 commit 921c0fd

File tree

10 files changed

+427
-4
lines changed

10 files changed

+427
-4
lines changed

docs/day02/04.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,7 @@ document.write('Hello' + 1 + 2);
4949
この場合、演算子の**結合規則**を考えます。`+`の結合規則は左から右なので、`3 + 4 + 'Hello'``(3 + 4) + 'Hello'``'Hello' + 1 + 2``('Hello' + 1) + 2`と解釈されることになります。
5050

5151
`+`は、両辺が数値の場合のみ加算演算子として振る舞い、片方が数値で片方が文字列の場合は数値を文字列に変換してから文字列結合演算子として機能します。このため、最終的な式全体の評価結果は前者が`7Hello`、後者が`Hello12`となるのです。
52+
53+
:::tip
54+
改行が表示されず困っていますか?`document.write`はHTMLタグを出力できます。`<br>`を用いたり、`p`タグで囲んでみたりしてみましょう。
55+
:::

docs/day02/07.md

Lines changed: 98 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
---
2-
title: 制御構造
2+
title: if文
33
---
44

5-
## if文
5+
`if`文を用いると、特定の条件下のみで実行されるプログラムを記述することができます。
66

7-
条件式が`true`のとき続く処理を実行します。
7+
## 基本構造
88

99
```js
1010
const age = 18;
@@ -13,4 +13,98 @@ if (age >= 20) {
1313
} else {
1414
document.write('子供です。');
1515
}
16-
```
16+
```
17+
18+
2行目の`if (age >= 20) {`の部分に差し掛かると、まずはカッコ内の`age >= 20`が評価されます。この式の値は`false`なので、
19+
20+
```js
21+
if (false) {
22+
document.write('大人です。');
23+
} else {
24+
document.write('子供です。');
25+
}
26+
```
27+
28+
`if`文の基本構造は
29+
30+
```
31+
if (式) 文1 else 文2
32+
```
33+
34+
です。式の値が`true`であれば文1が、`false`であれば文2が実行されます。よって、上記の例では`子供です。`が表示されます。
35+
36+
なお、`else`と文2は省略することもできます。
37+
38+
:::tip
39+
`{`から`}`で囲まれた部分のことを**ブロック**と呼び、複数の文をグループ化することができます。上の例では文は1つずつなのでこの括弧は必要ありませんが、複数の文を入れる場合は必ず必要になります。
40+
41+
ブロックを作る場合は、適切に**インデント**(字下げ)を行いましょう。上の例では、2行目と4行目のみが、他の部分と比べ**スペース2文字分**だけ下がっていることが分かります。
42+
:::
43+
44+
## ネストされたif文とelse if
45+
46+
制御構造は、入れ子(**ネスト**)にすることで、より複雑な処理を記述できます。
47+
48+
```js
49+
const age = 19;
50+
if (age >= 20) {
51+
document.write('入場できます。');
52+
} else {
53+
if (age >= 18) {
54+
document.write('条件付きで入場できます。');
55+
} else {
56+
document.write('入場できません。');
57+
}
58+
}
59+
```
60+
61+
以上の例では、`age`
62+
63+
* 20以上であれば、`入場できます。`と表示
64+
* 18以上であれば、`条件付きで入場できます。`と表示
65+
* それ以外であれば、`入場できません。`と表示
66+
67+
という形になっています。ただし、この場合、外側の`else`に続く括弧内の文は`if`文ひとつのみですので、括弧を省略して
68+
69+
```js
70+
const age = 19;
71+
if (age >= 20) {
72+
document.write('入場できます。');
73+
} else if (age >= 18) {
74+
document.write('条件付きで入場できます。');
75+
} else {
76+
document.write('入場できません。');
77+
}
78+
```
79+
80+
のようにする場合が多いです。
81+
82+
## truthyとfalsy
83+
84+
次のコードの実行結果はどうなるでしょうか。
85+
86+
```js
87+
if ('Hello World!') {
88+
document.write('trueです。');
89+
} else {
90+
document.write('falseです。');
91+
}
92+
```
93+
94+
JavaScriptでは次のような値は、論理演算において`false`と同様に扱われます。
95+
96+
* `0` (数値)
97+
* `''` (空文字列)
98+
99+
などです。このような値を**falsy**な値であるといいます。falsyでない値はすべて`true`と同様、すなわち**truthy**な値です。よって、上の例では`trueです。`が表示されます。
100+
101+
## 課題
102+
103+
生まれた年を格納した変数を予め用意し、その年がうるう年かどうかを判定して表示するプログラムを作成してください。ただし、うるう年とは、西暦年が以下のいずれかの条件を満たす年であるものとします。
104+
105+
* 400で割り切れる
106+
* 100で割り切れないが、4で割り切れる
107+
108+
:::tip
109+
`%`**剰余演算子**と呼ばれ、除算の剰余を求めることができます。
110+
:::

docs/day02/08.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
---
2+
title: while文とfor文
3+
---
4+
5+
## while文の基本構造
6+
7+
`while`文は、以下の構造をとります。
8+
9+
```
10+
while (式) 文
11+
```
12+
13+
`while`は、式の値がtruthyであれば、文を実行します。文の実行が終わったら、もう一度式を評価するところからやり直します。この繰り返しです。例を見てみましょう。
14+
15+
```js
16+
let i = 0;
17+
while (i < 3) {
18+
document.write(i);
19+
i++;
20+
}
21+
```
22+
23+
```
24+
123
25+
```
26+
27+
`++`**インクリメント演算子**と呼ばれる単項演算子で、作用する変数に1を直接加えます。
28+
29+
プログラムの実行の流れを順に追っていきましょう。まずは`i < 3`、つまり`0 < 3`が評価され、`true`になります。`true`は明らかにtruthyなので、ブロック内の文が実行されます。
30+
31+
`document.write`により`0`が表示され、続けてインクリメント演算子により`i`の値が`0`から`1`に増えます。
32+
33+
ブロック内の文の実行が終わったので、再度式を評価します。`i < 3``1 < 3`ですのでやはり`true`です。ブロックが実行されます。
34+
35+
以上を`i = 3`となるまで繰り返します。
36+
37+
## for文の基本構造
38+
39+
上記の`while`文の例は`for`文を用いると以下のように書き直すことができます。
40+
41+
```js
42+
for (let i = 0; i < 3; i++) {
43+
document.write(i);
44+
}
45+
```
46+
47+
非常にシンプルになりました。`for`文は、以下のような構造をとります。
48+
49+
```
50+
for (初期化; 条件; 再設定) 文
51+
```
52+
53+
`while`文で置き換えたとき、`初期化`の部分が`while`文より手前に、`条件`の部分が`while`文の条件式に、`再設定`の部分が`while`文の中のブロックの末尾に入ると考えられます。
54+
55+
## 課題
56+
57+
Fizz Buzz問題と呼ばれる有名な問題があります。`for`文と`if`文を用いて実装してみましょう。
58+
59+
Fizz Buzz問題とは、1から100までの整数に対して、それぞれ以下の処理を実行するものです。
60+
61+
* 3の倍数なら`Fizz`と表示
62+
* 5の倍数なら`Buzz`と表示
63+
* 3と5の公倍数なら`FizzBuzz`と表示
64+
* 以上のいずれにも当てはまらない場合はその数字を表示
65+
66+
出力は以下のようになります。
67+
68+
```
69+
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 ...
70+
```

docs/day02/09.md

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
---
2+
title: 関数
3+
---
4+
5+
## 純粋な関数
6+
7+
次のコードを見てください。
8+
9+
```js
10+
let sum1To10 = 0;
11+
for (let i = 1; i <= 10; i++) {
12+
sum1To10 += i;
13+
}
14+
document.write(`<p>1から10の和は${sum1To10}です。</p>`);
15+
16+
17+
let sum6To18 = 0;
18+
for (let i = 6; i <= 8; i++) {
19+
sum6To18 += i;
20+
}
21+
document.write(`<p>6から18の和は${sum6To18}です。</p>`);
22+
```
23+
24+
:::note
25+
* `+=`**加算代入演算子**で、左辺の変数に右辺の式の値を加えます。式自体の評価結果は加算後の変数の値です。
26+
* `` ` ``(バッククォート)は**テンプレートリテラル**と呼ばれ、文字列中の`${`から`}`に囲まれた部分をJavaScriptの式として評価して文字列中に展開します。
27+
:::
28+
29+
見ての通り、1~10、6~18、それぞれの和を計算して表示するプログラムです。しかしながら、前半と後半で重複する部分が多く、無駄な感じがします。
30+
31+
:::tip
32+
情報の重複を許さないというルールは**DRY原則**(Don't Repeat Yourself)と呼ばれ、高品質な製品を実現するための基本的な枠組みとなっています。
33+
:::
34+
35+
## 副作用を持つ関数
36+
37+
**関数**を用いると、決まった処理をひとまとまりとして扱い、その処理に名前を付けることができます。
38+
39+
```js
40+
function sum(from, to) {
41+
let result = 0;
42+
for (let i = from; i <= to; i++) {
43+
result += i;
44+
}
45+
return result;
46+
}
47+
48+
document.write(`<p>1から10の和は${sum(1, 10)}です。</p>`);
49+
document.write(`<p>6から18の和は${sum(6, 8)}です。</p>`);
50+
```
51+
52+
JavaScriptにおける関数は、`function`キーワードから始まる1つのブロックです。
53+
54+
関数は、**引数**(ひきすう)をとることができます。`sum(from, to)``from``to`**仮引数**と呼び、関数内でその引数の値を扱うための変数となります。
55+
56+
関数を呼び出す側、例えば`sum(1, 10)`における`1``10`**実引数**と呼びます。この場合、`sum`関数側では`from``1`が、`to``10`が代入されて実行されます。
57+
58+
`return`文は、関数の中で到達すると、その時点で関数の実行を中断し、式の評価結果を確定させます。`sum(1, 10)`を実行して`return result;`まで到達したとき、`result``55`ですので、式`sum(1, 10)`の評価結果は`55`となります。関数の評価結果を、その関数の**戻り値**と呼びます。
59+
60+
関数は、数学のそれとは異なり、あくまでも処理のまとまりであって、値を返す必要はありません。上のコードは、以下のように書き直すことができます。
61+
62+
```js
63+
function showSum(from, to) {
64+
let result = 0;
65+
for (let i = from; i <= to; i++) {
66+
result += i;
67+
}
68+
document.write(`<p>${from}から${to}の和は${result}です。</p>`);
69+
}
70+
71+
showSum(1, 10);
72+
showSum(6, 18);
73+
```
74+
75+
上記の例において、`showSum``from`から`to`までの合計を計算して表示するための関数です。`return`文が存在しないので、値を返すことはありません。
76+
77+
:::tip
78+
上記の`sum`のように、数学の関数と同じく、引数を受け取って値を帰すだけの関数を、**純粋な関数**と呼びます。
79+
80+
`showSum`は、関数内で画面に文字を表示するという、関数の外界に影響を及ぼす処理(**副作用**)を行っています。副作用を持つ関数は純粋な関数ではありません。
81+
82+
`document.write`は、文字列を受け取ってそれを画面に表示させる、副作用を持つ関数であるといえます。
83+
:::
84+
85+
## 課題
86+
87+
文字列`str`と整数`count`を受け取り、`str``count`回繰り返し結合してその文字列を返す関数`repeat(str, count)`を作成してください。
88+
89+
```js
90+
document.write(repeat('*', 6)); // ******
91+
```
92+
93+
のようにして、作成した関数を実際に実行してみてください。
94+
95+
:::info
96+
加算代入演算子は、`+`と同じく、文字列結合の用途にも使用できます。
97+
:::

docs/day02/10.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
---
2+
title: デバッグ
3+
---
4+
5+
プログラムが誤っているとき、当然ながらプログラムは動作しません。この誤りを**バグ**と呼びます。バグを消すための操作を**デバッグ**と呼びます。デバッグには、以前学習した開発者ツールを利用することができます。
6+
7+
## console.log
8+
9+
ブラウザ上で動作するJavaScriptのプログラムで`console.log`が呼ばれると、開発者ツールの**コンソール**にその値が表示されます。
10+
11+
```js
12+
console.log('Hello World!');
13+
```
14+
15+
開発者ツールを確認してみましょう。
16+
17+
![コンソールに表示されたHello World](10/console.png)
18+
19+
## デバッガ
20+
21+
**デバッガ**は、デバッグを支援するためのソフトウェアです。ブラウザの開発者ツールには、JavaScript向けの非常に強力なデバッガが搭載されています。
22+
23+
以下のコードを実行してみましょう。
24+
25+
```js title="script.js"
26+
for (let i = 0; i < 10; i++) {
27+
console.log(i);
28+
}
29+
```
30+
31+
Chromeの開発者ツールでは、`Sources`タブで記述されているHTMLやCSS、JavaScriptファイルの内容を表示できます。先ほど記述した`script.js`の2行目の、**行番号の左側**をクリックしてみましょう。丸い記号が表示されるはずです。
32+
33+
![ブレークポイントの設置](10/set-breakpoint.png)
34+
35+
これは、**ブレークポイント**と呼ばれる、プログラムの実行を一時的に中断するための機能です。ブレークポイントが実際に動作することを確認するため、ページをリロードしてみましょう。
36+
37+
![変数の値の表示](10/inspect-variables.png)
38+
39+
プログラムの実行が一時中断されました。この状態で、変数名にカーソルを合わせると、その時点での変数の値が表示されます。また、画像中では右側に表示されているパネルには、定義されている変数の一覧も表示されていることがわかります。
40+
41+
再生ボタンを押すと、プログラムの実行が再開されます。上記の例の場合は、次のループでもう一度2行目が実行されるため、そこでまたプログラムが中断されます。10回のループの間に、変数の値がどのように変化しているかを観察してみてください。
42+
43+
:::tip
44+
再生ボタンの右隣にある3つのアイコンは、順に**ステップオーバー****ステップイン****ステップアウト**です。
45+
46+
ステップオーバーを利用すると、プログラムの実行が次の文に移動します。ステップインの動作はステップオーバーの動作と似ていますが、実行中の文に関数が含まれる場合、その内部に移動します。ステップアウトは、現在処理している関数の処理を抜けたところまで実行します。
47+
:::

docs/day02/10/console.png

76.4 KB
Loading
94.3 KB
Loading

docs/day02/10/set-breakpoint.png

87.8 KB
Loading

0 commit comments

Comments
 (0)