モダンJavaScript:データ処理とコード設計のよくある間違い

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

このコースで育てるもの

レッスンを読む

入門のファイルを直接書き換えてしまう

途中で分からなくなったときに戻る先が無くなります。script.js はそのまま残し、コピーを app.js として作ってください

このコースで育てるもので詳しく読む

データと表示を同じ関数に混ぜる

下のように配列の宣言と描画が同じ関数に入っていると、データを外から取ってくる形に変えるときに関数ごと書き直しになります。次のレッスンからの主題がここです

このコースで育てるもので詳しく読む

先に第8章から手を付ける

非同期処理はこのコースの目玉ですが、trycatch を知らないまま await のエラー処理に入ると、例外の話をしているのか非同期の話をしているのか切り分けられなくなります。第6章を先に置いてあるのはそのためです

このコースで育てるもので詳しく読む

strict mode が先に教えてくれる間違い

レッスンを読む

エラーが増えたので外してしまう

strict mode にした直後は、それまで隠れていた不具合が一気に表に出ます。増えたのはエラーであって不具合ではありません。1 つずつ潰すほうが、黙って間違った値が表示され続ける状態よりも短時間で終わります

strict mode が先に教えてくれる間違いで詳しく読む

表示とデータを切り分ける

レッスンを読む

未設定の項目をそのまま使う

tags を持たない作品が 1 件でもあると、そこで処理全体が止まります。第9章で API から取ってきたデータには、項目が欠けている行が混ざります

表示とデータを切り分けるで詳しく読む

分割代入で必要な値だけ取り出す

レッスンを読む

受け皿を 1 か所しか置かない

引数全体には = {} があるのに、stats には付いていません。引数は渡されているので外側の既定値は使われず、undefinedstats を開いて落ちます。開く階層それぞれに受け皿が要ります。

分割代入で必要な値だけ取り出すで詳しく読む

スプレッドとレストで組み替える

レッスンを読む

keys と values と entries

レッスンを読む

map の中でオブジェクトを返してしまう

fromEntries が受け取れるのは [キー, 値] の 2 要素配列の並びです。[title, count] の形で返してください。

keys と values と entriesで詳しく読む

値だけ取ってキーを失う

キーが必要になる可能性があるなら、最初から entries で開きます。values は合計や最大値のように、キーを完全に捨ててよいときだけ使います。

keys と values と entriesで詳しく読む

ビット演算でフラグをまとめる

レッスンを読む

クラスとインスタンス

レッスンを読む

メソッドの中で this を書き忘れる

title とだけ書くと、インスタンスのプロパティではなく変数を探しに行きます。見つからなければ ReferenceError です。

クラスとインスタンスで詳しく読む

constructor で値を返そうとする

return { title } のようにオブジェクトを返すと、new の結果がそのオブジェクトに差し替わり、メソッドを持たない素のオブジェクトができます。constructor では this に代入するだけにします。

クラスとインスタンスで詳しく読む

private フィールドとアクセサ

レッスンを読む

set の中で同じ名前に代入する

set views(value) の中で this.views = value と書くと、また set views が呼ばれます。それが延々と続いてスタックがあふれます。代入先は必ず #views のほうです。

private フィールドとアクセサで詳しく読む

継承と super

レッスンを読む

super() を呼ばない

extends を書いたら、子の constructor では必ず super() を呼びます。呼ばないまま constructor が終わっても ReferenceError です。

継承と superで詳しく読む

親に渡す引数を忘れる

super() を引数なしで呼ぶと、親の constructor の引数が全部 undefined になります。エラーにはならないので、undefined (undefined) という文字が画面に出てから気づくことになります。

継承と superで詳しく読む

super.describe()this.describe() と書く

上書きしたメソッドの中で this.describe() を呼ぶと、上書きしたほう自身がもう一度呼ばれます。止まらなくなって RangeError になります。親を呼ぶときは super. です。

継承と superで詳しく読む

多態と static

レッスンを読む

インスタンスから static を呼ぶ

work.from(record) と書くと TypeError です。static はクラスに付いているので Work.from(record) と書きます。

多態と staticで詳しく読む

static のメソッドの中で this をインスタンスのつもりで使う

staticthis はクラス自身です。this.title と書いても undefined にしかなりません。

多態と staticで詳しく読む

上書きしたつもりでメソッド名を間違える

formatfomat と書いても、その場ではエラーになりません。子のインスタンスで format() を呼ぶと親の format が静かに動き、「人気」が付かない行が混ざります。上書きが効いていないときは、まず名前を見比べます。

多態と staticで詳しく読む

つくる 作品コレクションをクラスにする

レッスンを読む

try catch finally

レッスンを読む

失敗する行が try の外にある

失敗しうるのは JSON.parse のほうなので、囲む場所がずれている。try には失敗しうる行を入れる。ただし囲みすぎもよくない。関係のない処理まで入れると、どこで失敗したのか catch から分からなくなる。

try catch finallyで詳しく読む

catch を空にする

これで画面は止まらなくなるが、なぜ何も出ないのかが誰にも分からなくなる。この章の最後の回で、受け取った失敗を利用者に見える形で出す。

try catch finallyで詳しく読む

message の文字列で分岐する

メッセージは環境で変わるので、この if はいつか静かに通らなくなる。分けたいときは error.name を見るか、次のレッスンで作る自前のエラークラスを使う。

try catch finallyで詳しく読む

自分でエラーを投げる

レッスンを読む

super を呼ばずにプロパティを触る

これは実行した時点で ReferenceError になる。継承したクラスでは super() を呼ぶまで this を触れない。super を必ず先頭に置く。

自分でエラーを投げるで詳しく読む

失敗を画面に出す

レッスンを読む

成功したときに前の表示を消していない

これは成功したときに is-error を外していない。一度失敗すると、そのあと何回成功しても赤い枠が残る。try に入る前に clearError() を呼ぶ。

失敗を画面に出すで詳しく読む

エラーの文を alert で出す

alert は押すまで消えず、押したら跡が残らない。利用者は文言を読み返せず、画面のどこが失敗したのかも分からない。失敗した場所の近くに、消えない形で出す。

失敗を画面に出すで詳しく読む

表示を隠すのに要素を消してしまう

これで見えなくはなるが、次に失敗したときに出す先が無くなる。隠すのと消すのは違う。付け外しするのは class だけにする。

失敗を画面に出すで詳しく読む

正規表現のきほん

レッスンを読む

{4} を「4 桁ちょうど」だと思い込む

/\d{4}/ は「4 個並んだ箇所がある」という意味であって、「全体が 4 桁」ではありません。"12345" にも当たります。全体を縛りたいときは、次のレッスンで扱う ^$ が要ります。

正規表現のきほんで詳しく読む

入力を検証する

レッスンを読む

g フラグを付けた正規表現を test で使い回す

これは知らないと必ず一度は踏みます。g フラグ付きの正規表現オブジェクトは lastIndex という「次にどこから探すか」を内部に持っていて、test が当たるたびにそれを進めます。関数の外に置いて使い回すと、2 回目の呼び出しが前回の続きから探し始めて false になります。

入力を検証するで詳しく読む

空文字列を弾けていると思い込む

+ は 1 個以上なので空文字列は弾けますが、* は 0 個以上なので通します。空の入力を弾くつもりで * を書くと素通りします。

入力を検証するで詳しく読む

置換とキャプチャ

レッスンを読む

g を付け忘れて 1 件だけ置き換わる

テストケースが 1 件しか日付を含まないと気付けません。複数入った文字列で必ず確かめます。

置換とキャプチャで詳しく読む

置換関数の第 1 引数をキャプチャだと思う

第 1 引数は当たった全体で、キャプチャは第 2 引数からです。ここを 1 つずらすと、年のつもりで 2026-04-01 全体を受け取ってしまいます。

置換とキャプチャで詳しく読む