JavaScript基礎文法:処理を組み立てるのよくある間違い

レッスンの本文で注意している点を、つまずきの側から80件ぶん並べ直しました。書いた覚えのある形が見つかったら、 そのままレッスンに戻って前後を読めます。

if 文の基本

レッスンを読む

else のブロックで return を書き忘れる

どちらの道でも値を返すつもりが、片方だけ undefined になります。

if 文の基本で詳しく読む

条件の向きを逆に書く

「3 つ以上なら称号」を count <= 3 と書いてしまうパターンです。書き終えたら、境目の値を 1 つ選んで頭の中で流してみましょう。count が 3 のとき、期待どおりの文字列が返るかを確かめれば、向きの間違いはその場で見つかります。

if 文の基本で詳しく読む

if / else if / else で段階判定

レッスンを読む

最後の else を書き忘れる

どの範囲にも当てはまらない値が来たときに undefined が返ります。経験年数が 0 の場合を想定していないコードは、実際にその値が来た瞬間に壊れます。最後は必ず else で受け止めてください。

if / else if / else で段階判定で詳しく読む

switch 文で値を一覧から選ぶ

レッスンを読む

default を書かない

想定外の値が来たときに何も返らず undefined になります。default は最後に置くのが慣習ですが、書く位置は自由です。どこに置いても「どの case にも一致しなかったとき」に実行されます。とはいえ途中に書くと読み手が混乱するので、素直に最後へ置いてください。

switch 文で値を一覧から選ぶで詳しく読む

条件を組み合わせる

レッスンを読む

フラットにしたのに順番を直さない

入れ子を機械的に開いただけで、広い条件を先に書いてしまうパターンです。書き換えたら、必ず代表的な入力を 3 つほど手で流して、元のコードと同じ答えになるか確かめてください。今回なら公開かつ web、公開かつ design、非公開の 3 つで足ります。

条件を組み合わせるで詳しく読む

FizzBuzz で複数条件を組み立てる

レッスンを読む

数値をそのまま返す

倍数でないときに return n; と書くと、数値が返ります。今回は文字列を返す仕様なので String(n) に通してください。戻り値の型がそろっていないと、呼び出す側が毎回型を気にすることになります。

FizzBuzz で複数条件を組み立てるで詳しく読む

つくる 時間帯で挨拶を変える

レッスンを読む

境界値を重複させる

hour <= 12hour >= 12 を両方書くと、12 時がどちらの枝にも当てはまります。else if なら先に書いたほうが勝つので結果は出ますが、表と食い違ったまま気付けません。上限は < 12、下限は >= 12 のように、片方だけが含む形にそろえてください。

つくる 時間帯で挨拶を変えるで詳しく読む

else を書かずに終える

3 つ目を else if (hour >= 18) と書いてしまうと、0 時から 4 時がどの枝にも入らず undefined が返ります。すべての値がどれか 1 つの枝に必ず入ることを、023 を手で流して確かめてください。

つくる 時間帯で挨拶を変えるで詳しく読む

配列のきほん

レッスンを読む

インデックスを 1 から数えてしまう

1 番目の要素は works[0] です。works[1] は 2 番目です。ひとつずつずれるこの間違いは off-by-one エラーと呼ばれ、経験を積んだ人でもやります

配列のきほんで詳しく読む

末尾を取るときに length をそのまま使う

works[works.length] は必ず存在しないインデックスになるので undefined です。- 1 を忘れないでください

配列のきほんで詳しく読む

length にカッコを付ける

works.length()TypeError になります。length は関数ではなく、配列が持っている値そのものです

配列のきほんで詳しく読む

要素を足す・取り除く

レッスンを読む

for ループで合計を求める

レッスンを読む

更新を書き忘れて無限ループ

i++ を忘れると i がずっと 0 のままで条件が真であり続け、ループが終わりません。ブラウザのタブが固まるので、書いたらまず更新式を確認してください

for ループで合計を求めるで詳しく読む

for-of で配列を走査する

レッスンを読む

ofin と書いてしまう

for-in は要素ではなくキー、つまり "0" "1" という文字列を返します。数値ではなく文字列である点も含めて挙動が変わるので、配列には of を使います

for-of で配列を走査するで詳しく読む

インデックスが必要なのに for-of を選ぶ

何周目かを知る手段が無いので、自分でカウンタを足すことになります。そこまでするなら最初から通常の for のほうが素直です

for-of で配列を走査するで詳しく読む

while で条件を満たす間くり返す

レッスンを読む

break と continue でループを制御する

レッスンを読む

つくる 作品リストを一覧にする

レッスンを読む

1. return を書き忘れる

表示されているので動いているように見えますが、値は返っていません。

関数宣言で詳しく読む

2. 呼び出すときに丸括弧を忘れる

greet は関数そのもの、greet("山田 太郎") は呼び出した結果です。この違いは後のコールバックのレッスンで重要になるので、今のうちに区別しておいてください。

関数宣言で詳しく読む

3. return の直後で改行してしまう

JavaScript は行末に自動でセミコロンを補うことがあります。return の直後で改行すると、そこで文が終わったと解釈されます。返したい値は return と同じ行に書き始めてください。

関数宣言で詳しく読む

アロー関数

レッスンを読む

1. 式本体なのに return を書く

{ } を書いたら return が要る、書かなければ return は要らない。この対応関係で覚えると混乱しません。

アロー関数で詳しく読む

2. ブロック本体で return を忘れる

{ } を付けた瞬間、return は自分で書く責任が発生します。省略記法から書き直したときに起こりやすいミスです。

アロー関数で詳しく読む

3. セミコロンの位置を間違える

アロー関数は代入文の一部です。関数宣言の } の後ろにセミコロンは不要ですが、アロー関数では必要になります。

アロー関数で詳しく読む

デフォルト引数

レッスンを読む

1. 既定値に頼れば null 対策も済むと思い込む

API から返ってきた値が null だったという場面は頻繁にあります。null も既定値に寄せたいなら、関数の中で role ?? "準備中" と書く必要があります。

デフォルト引数で詳しく読む

3. 既定値を書いたのに呼び出し側で空文字列を渡している

入力欄が空のまま送信されると、undefined ではなく空文字列が渡ります。フォームの値を扱うときは、既定値だけに任せず、空文字列のチェックも自分で書きましょう。

デフォルト引数で詳しく読む

早期 return でネストを浅くする

レッスンを読む

2. ガード節に本体の判定まで混ぜる

これは動きますが、どれが異常系でどれが正常系なのか読み手には分かりません。異常系のガードを冒頭に固め、正常系の分岐は本体側で if / else if として書き分けたほうが意図が伝わります。

早期 return でネストを浅くするで詳しく読む

3. 条件の否定を書き間違える

ガード節では条件を否定形で書く場面が多く、! の付け忘れがそのまま逆の動作になります。書いたあとに 1 度、「この条件が true のとき何が起きるか」を声に出して確かめる癖を付けると防げます。

早期 return でネストを浅くするで詳しく読む

変数のスコープ

レッスンを読む

1. 関数の中で宣言を忘れて外の変数を使ってしまう

letconst を書き忘れただけで、ローカル変数のつもりが外側の変数への代入になります。

変数のスコープで詳しく読む

3. ループ変数を外から参照しようとする

ループが終わったあとに回数を使いたいなら、for の外で let を宣言してから使います。

変数のスコープで詳しく読む

コールバック関数

レッスンを読む

2. コールバックの中で return を書き忘れる

アロー関数で { } を書いたら return が必要でした。コールバックでも同じルールです。

コールバック関数で詳しく読む

3. 受け取った引数の名前と実際に渡ってくる値がずれている

エラーにはなりませんが、読む人が確実に混乱します。渡ってくる値の意味に合った名前を付けてください。

コールバック関数で詳しく読む

forEach で配列をまわす

レッスンを読む

つくる 処理を関数に整理する

レッスンを読む

3. 空配列のときの分岐を忘れる

[].join("\n") は空文字列です。エラーにはならないので気付きにくく、画面には不自然な余白だけが残ります。空のときに何を返すかは、仕様として先に決めておきましょう。

つくる 処理を関数に整理するで詳しく読む

オブジェクトのきほん

レッスンを読む

入れ子の途中が無いのに深く掘ろうとする

work.linksundefined なので、そこからさらに .url を読もうとした瞬間にエラーになります。この問題への対処法はこの章の後半で扱います。

オブジェクトのきほんで詳しく読む

オブジェクトで複数の値を返す

レッスンを読む

const と参照

レッスンを読む

const なら安全だと思い込む

オブジェクトを関数に渡すことは、書き換えの権利を渡すことでもあります。渡した先で何をされるか分からない場合は、コピーを渡すのが安全です。

const と参照で詳しく読む

コピーしたつもりで同じ実体を触る

= はコピーではありません。本当にコピーしたいときの書き方は次のレッスンで扱います。

const と参照で詳しく読む

?. で安全に取り出す

レッスンを読む

付け替えの向きを逆にする

左がキー、右が新しい変数名です。「元の名前 から 新しい名前」の順と覚えます。

分割代入で詳しく読む

オブジェクトなのに [] を使う

配列は []、オブジェクトは {} です。オブジェクトは位置を持たないので [] では取り出せません。

分割代入で詳しく読む

文の先頭に { を置いて代入する

宣言と同時に書く const { title } = work; なら問題は起きません。後から代入したいときだけ、この落とし穴があります。

分割代入で詳しく読む

スプレッド構文

レッスンを読む

浅いコピーで安心する

copy.tags は元と同じ配列です。中身を触るなら { ...work, tags: [...work.tags] } のように階層ごとにコピーします。

スプレッド構文で詳しく読む

オブジェクトを [] で展開しようとする

[] の中で展開できるのは配列や文字列などの反復可能なものだけです。オブジェクトを展開したいなら {} の中で行います。

スプレッド構文で詳しく読む

find と includes で探す

レッスンを読む

find の結果をそのまま使う

見つからないと undefined なので、そこからプロパティを読もうとすると止まります。前のレッスンの ?. が効きます。

find と includes で探すで詳しく読む

つくる 作品データを構造化する

レッスンを読む