ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
ループの種類
| 書き方 | 取り出すもの | break | await |
|---|---|---|---|
for (let i = 0; ...) | 添字 | ○ | ○ |
for...of | 値 | ○ | ○ |
for...in | キー(文字列) | ○ | ○ |
forEach | 値・添字・配列 | × | × |
while / do...while | — | ○ | ○ |
const fruits = ["りんご", "みかん", "ぶどう"];
for (const f of fruits) console.log(f); // 値
for (const [i, f] of fruits.entries()) console.log(i, f); // 番号 + 値
fruits.forEach((f, i) => console.log(i, f));
for (let i = 0; i < fruits.length; i++) console.log(fruits[i]);
let n = 3;
while (n > 0) { console.log(n); n--; }
do { console.log("1 回は必ず実行"); } while (false);
for...in を配列に使わない
const arr = [10, 20, 30];
for (const i of arr) console.log(i); // 10 20 30 値
for (const i in arr) console.log(i); // "0" "1" "2" キー(文字列!)
for (const i in arr) {
console.log(arr[i] + 1); // 11 21 31(たまたま動く)
console.log(i + 1); // "01" "11" "21" ← 文字列連結になる
}
// 誰かが配列を拡張していると余計なものまで拾う
Array.prototype.custom = () => {};
for (const k in arr) console.log(k); // "0" "1" "2" "custom"
for (const v of arr) console.log(v); // 10 20 30(影響なし)
for...in はオブジェクトのキーを回すための構文です。配列には for...of を使ってください。
オブジェクトを回す
const scores = { math: 80, english: 70 };
// 推奨: entries で分解する
for (const [key, value] of Object.entries(scores)) {
console.log(`${key}: ${value}`);
}
// for...in を使うなら自分のキーだけに絞る
for (const key in scores) {
if (!Object.hasOwn(scores, key)) continue;
console.log(key, scores[key]);
}
// Map はそのまま回せる
const m = new Map([["a", 1]]);
for (const [k, v] of m) console.log(k, v);
forEach の制約
const nums = [1, 2, 3, 4];
// break できない
nums.forEach((n) => {
if (n > 2) return; // この 1 回を抜けるだけ(continue 相当)
console.log(n);
});
// 途中で止めたいなら for...of か some を使う
for (const n of nums) {
if (n > 2) break;
console.log(n);
}
nums.some((n) => { if (n > 2) return true; console.log(n); });
await が効かない
// 期待どおりに動かない: forEach は Promise を待たない
ids.forEach(async (id) => {
const user = await fetchUser(id);
console.log(user);
});
console.log("完了"); // ← 取得を待たずにここへ来る
// 順番に処理する
for (const id of ids) {
const user = await fetchUser(id);
console.log(user);
}
console.log("完了");
// 並行して処理する(速いが同時接続に注意)
const users = await Promise.all(ids.map((id) => fetchUser(id)));
// 1 件失敗しても他を続けたい
const results = await Promise.allSettled(ids.map((id) => fetchUser(id)));
非同期処理を含むループでは forEach を使わないのが鉄則です。詳細は 非同期処理 を参照してください。
break と continue
for (const n of [1, 2, 3, 4, 5]) {
if (n % 2 === 0) continue; // 偶数は飛ばす
if (n > 3) break; // 3 を超えたら抜ける
console.log(n); // 1 3
}
// 多重ループはラベルで一気に抜けられる
outer:
for (const row of matrix) {
for (const v of row) {
if (v === target) break outer;
}
}
// 関数にして return するほうが読みやすい
function find(matrix, target) {
for (const [y, row] of matrix.entries()) {
for (const [x, v] of row.entries()) {
if (v === target) return [y, x];
}
}
return null;
}
ループ変数と非同期
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0);
}
// 3 3 3 ← i が 1 つしかない
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0);
}
// 0 1 2 ← 繰り返しごとに新しい i
イベントハンドラーを繰り返し登録するときも同じです。ループ変数は必ず let にしてください(変数の宣言)。
ループ中に配列を変更しない
const nums = [1, 2, 3, 4];
// 危険: 削除すると後ろがずれて飛ばされる
for (let i = 0; i < nums.length; i++) {
if (nums[i] % 2 === 0) nums.splice(i, 1);
}
// 対処 1: 新しい配列を作る(推奨)
const odds = [1, 2, 3, 4].filter((n) => n % 2 !== 0);
// 対処 2: 後ろから回す
for (let i = nums.length - 1; i >= 0; i--) {
if (nums[i] % 2 === 0) nums.splice(i, 1);
}
DOM を扱うとき
// querySelectorAll は NodeList。for...of と forEach は使えるが map は使えない
for (const li of document.querySelectorAll("li")) li.classList.add("done");
// map などを使いたければ配列にする
const texts = [...document.querySelectorAll("li")].map((li) => li.textContent);
// getElementsByClassName は「生きた」コレクション
const items = document.getElementsByClassName("item");
for (let i = 0; i < items.length; i++) {
items[i].classList.remove("item"); // 消すたびに length が減り、半分しか処理されない
}
// 対処: 先に配列へ固定する
for (const el of [...items]) el.classList.remove("item");
getElementsByClassName / getElementsByTagName の戻り値はDOM の変更に追従して中身が変わります。ループ内で該当条件を変える場合は、先にスプレッドで配列に固定してください。
ループを書かずに済ませる
const nums = [1, 2, 3, 4, 5];
// 変換するだけ
const doubled = nums.map((n) => n * 2);
// 絞り込むだけ
const evens = nums.filter((n) => n % 2 === 0);
// 集計するだけ
const total = nums.reduce((acc, n) => acc + n, 0);
// 決まった回数だけ回す
Array.from({ length: 3 }, (_, i) => i).forEach((i) => console.log(i));
「配列を作るためだけの for」は map / filter に置き換えられます。副作用(DOM 操作・通信)を伴う処理は素直に for...of で書いてください。
関連
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- 【django】ログイン 認証機能 2026-09-08 03:22:09
- MySQL ERROR 1063 Incorrect column specifier for column|原因と直し方 2026-09-08 03:11:09
- 【PHPエラー】Object of class stdClass could not be converted to string 2026-09-07 07:46:04
- Julia Genie ローカル開発サーバ起動完全ガイド 2026-09-07 07:46:04
- Wi-Fi とは|規格と世代(Wi-Fi 4〜7)・周波数帯・CSMA/CA・WPA3 NEW 2026-09-07 07:45:13
- set コマンドでシェルオプションと位置パラメータを操作 | bash 2026-09-07 07:45:13
- JPEG(.jpg/.jpeg)画像形式の完全ガイド — 仕様・マジックナンバー・他形式との比較・EXIF 2026-09-07 07:45:13
- UE5 Get Overlapping Actorsで特定クラスだけ処理|Class Filter・Cast To 2026-09-07 07:45:13
- Linuxで特定拡張子のファイルを再帰削除|find -deleteの安全手順 2026-09-07 07:45:13
- Django CBVでテンプレートに値を渡す|get_context_data・extra_context 2026-09-07 07:45:13
- Linuxで複数ファイルの文字列を一括置換|find・sed・xargsの安全手順 2026-09-07 07:45:13
- Laravelルートグループ|prefix・middleware・nameで一括管理 2026-09-07 07:45:13
- Linux whichコマンドの使い方|絶対パス取得とtype・command -vの違い 2026-09-07 07:45:13
- Linux catコマンドの使い方|行番号表示・複数ファイル連結 2026-09-07 07:45:13
- unable to execute 'gcc': No such file or directory 2026-09-07 07:45:13
コメントを削除してもよろしいでしょうか?