可読性向上パターンの考え方
テンプレート文字列は“見た目をコードにそのまま表せる”のが強みです。ここが重要です:見た目(レイアウト)とロジック(計算・整形)を分離し、式の埋め込みは短く保つことで、初心者でも無理なく読めるテンプレートにできます。
// NG:テンプレート内に長い計算や分岐がベタ書き
const s1 = `
<p>合計: ${(list.filter(x => x.active).reduce((s, x) => s + x.price, 0) * 1.1).toFixed(0)} 円</p>
`;
// OK:ロジックは外へ、テンプレートは見た目だけ
const sumActive = rows => rows.filter(r => r.active).reduce((s, r) => s + r.price, 0);
const yen = n => `${Math.round(n).toLocaleString("ja-JP")} 円`;
const s2 = `<p>合計: ${yen(sumActive(list) * 1.1)}</p>`;
JavaScript補助関数の導入(見た目とロジックの分離)
整形用の小さな関数を用意する
数値・日付・文字列の整形は、短い補助関数へ切り出すとテンプレートがすっきりします。ここが重要です:テンプレートの ${...} に入るのは“意味の分かる一語”にする。
const yen = n => `${n.toLocaleString("ja-JP")} 円`;
const pad2 = n => String(n).padStart(2, "0");
const time = d => `${pad2(d.getHours())}:${pad2(d.getMinutes())}:${pad2(d.getSeconds())}`;
const now = new Date();
const html = `
<section>
<p>現在時刻: ${time(now)}</p>
<p>価格: ${yen(123456)}</p>
</section>
`;
JavaScript条件は短く、複雑なら事前計算
三項演算子や論理演算子は短いときだけ使い、複雑な判定は変数にして埋め込む。
const isSale = price => price > 100000;
const badge = isSale(123456) ? '<span class="badge">SALE</span>' : '';
const row = `<td>123,456 円 ${badge}</td>`;
JavaScript改行とインデントの整え方(構造を見せる)
余計な空白を避けつつ、構造は保つ
テンプレート文字列は改行・空白を保持します。ここが重要です:先頭・末尾の空白は trim() で落とす、インデントは“見た目の整合性”を優先し、必要に応じてデデント(左寄せ)を使います。
const block = `
<ul>
<li>A</li>
<li>B</li>
</ul>
`.trim();
JavaScriptデデントでコードはインデント、出力は左端
タグ付きテンプレートでインデントを取り除くと、コードも出力も見やすく保てます。
function dedent(strings, ...vals) {
let text = strings.reduce((o, s, i) => o + s + (vals[i] ?? ""), "");
text = text.replace(/^\n+/, "").replace(/\n+$/, "\n");
const lines = text.split("\n");
const min = Math.min(...lines.filter(l => l.trim()).map(l => l.match(/^(\s*)/)[1].length));
return lines.map(l => l.slice(min)).join("\n");
}
const card = dedent`
<div class="card">
<h2>Title</h2>
<p>Body</p>
</div>
`;
JavaScript配列との相性を活かす(リスト・テーブルの量産)
map と join を定型化する
ここが重要です:要素テンプレートを小さく分け、map(...).join("") で連結。ネストは“部分テンプレート”に分割して読みやすく。
const yen = n => `${n.toLocaleString("ja-JP")} 円`;
const rowHtml = r => `
<tr class="${r.active ? "on" : "off"}">
<td>${r.id}</td>
<td>${r.name.trim()}</td>
<td>${yen(r.price)}</td>
</tr>
`;
const tableHtml = rows => `
<table>
<thead><tr><th>ID</th><th>商品名</th><th>価格</th></tr></thead>
<tbody>${rows.map(rowHtml).join("")}</tbody>
</table>
`;
JavaScript長いテンプレートは“部品化”して合成
大きなページはヘッダ・ボディ・フッタなどに分け、最終テンプレートで組み合わせる。
const header = title => `<header><h1>${title}</h1></header>`;
const footer = () => `<footer>© 2025</footer>`;
const page = (title, body) => `
${header(title)}
<main>${body}</main>
${footer()}
`;
JavaScript変数名と式の“読みやすさ”を設計する
意味が伝わる名前にしてから埋め込む
ここが重要です:${...} に直接計算を書く代わりに、意味のある変数へ代入してから挿入すると、初学者にも意図が伝わります。
const total = 123456;
const totalLabel = `${total.toLocaleString("ja-JP")} 円`;
const summary = `合計: ${totalLabel}`;
JavaScriptオブジェクトは文字列化してから埋め込む
そのままだと [object Object] になります。JSON か独自フォーマットに。
const user = { id: 7, name: "Alice" };
const info = `user=${JSON.stringify(user)}`;
JavaScript安全性と可読性の両立(最低限の防御)
ユーザー入力はサニタイズを標準化
テンプレートは“見た目”だけに集中するため、埋め込む前に必ずエスケープしておくと可読性と安全性を同時に満たします。
const escapeHtml = s => String(s).replace(/[&<>"']/g, c => ({
"&": "&", "<": "<", ">": ">", '"': """, "'": "'"
}[c]));
const safeName = escapeHtml(`<Alice>`);
const card = `
<div class="card"><h2>${safeName}</h2></div>
`;
JavaScriptDOM API でテキスト・属性を扱う
innerHTML で混ぜない設計にすると、テンプレートは構造のみに専念できます。
const el = document.createElement("p");
el.textContent = `ようこそ、${safeName} さん`;
document.body.appendChild(el);
JavaScript実用例で理解を固める
// 1) カード一覧:部品化+補助関数
const yen = n => `${n.toLocaleString("ja-JP")} 円`;
const card = ({ id, name, price }) => `
<div class="card" data-id="${id}">
<h2>${name.trim()}</h2>
<p>価格: ${yen(price)}</p>
</div>
`;
const listHtml = items => `
<div class="cards">
${items.map(card).join("")}
</div>
`;
// 2) 明細:事前計算+短い式埋め込み
const sum = rows => rows.reduce((s, r) => s + r.price, 0);
const detail = rows => {
const total = sum(rows);
const totalLabel = `${total.toLocaleString("ja-JP")} 円`;
return `
<section>
<h3>明細</h3>
${tableHtml(rows)}
<p>合計: ${totalLabel}</p>
</section>
`;
};
// 3) デデントで読みやすい HTML を出力
const page = title => dedent`
<!doctype html>
<html lang="ja">
<body>
${header(title)}
<main>
${listHtml([{ id: 1, name: "Apple", price: 100 }])}
</main>
${footer()}
</body>
</html>
`;
JavaScriptまとめ
可読性向上の核心は「テンプレートは見た目、ロジックは補助関数へ。式の埋め込みは短く、意味のある名前で事前計算する」ことです。改行・インデントは意図的に整え、必要ならデデントで左寄せ。配列は部品テンプレート+map/join、長いテンプレートは部品化して合成。オブジェクトは文字列化、ユーザー入力は標準化されたサニタイズを通す。これらを徹底すれば、初心者でも読みやすく安全で保守しやすいテンプレート文字列を書けます。
