JavaScriptの文字列整形:`padStart`と`padEnd`を使い倒して「泥臭い実装」を卒業しよう
フロントエンドの現場で、「あと少しだけ文字列を調整したい」という瞬間は星の数ほどありますよね。
例えば、APIから飛んできた時刻データを `9:5` と表示するのではなく `09:05` と整形したり、UI上でIDを揃えたり。
昔の我々は、これを実現するために「文字列の長さを判定して、足りなければループで0を足す」といった、いわゆる泥臭いユーティリティ関数を書いていました。しかし、今のJavaScript(ES2017以降)には、標準で `padStart` と `padEnd` が用意されています。
これらは単なる「便利なメソッド」以上のポテンシャルを持っています。今回は、現場で即戦力となる使いこなし術を、少し深掘りして解説しましょう。
—
1. なぜ「手動」で書くのをやめるべきか
まずは基本の書き方です。 `str.padStart(targetLength, padString)` は、対象の文字列が指定した長さになるまで、先頭(あるいは末尾)に指定した文字を埋め込みます。
// 実務で頻出:時刻のゼロ埋め
const hour = 9;
const minute = 5;
// 数値のままではメソッドは呼べないのでStringに変換してから
const formattedTime = `${String(hour).padStart(2, ‘0’)}:${String(minute).padStart(2, ‘0’)}`;
console.log(formattedTime); // “09:05”
このコードの美しさは、「条件分岐(if文)」が排除されている点にあります。
もしこれを自前で実装しようとすると、`if (str.length < 2) { ... }` といったガード節が必要になり、テストケースも増えます。標準メソッドを使うことは、コードの可読性を高めるだけでなく、バグの温床を一つ減らすことに直結するのです。
---
2. ブラウザの裏側で何が起きているのか
少し技術的な話をしましょう。これらのメソッドは内部的にどう動いているのでしょうか。
実は、`padStart` や `padEnd` は、単純に文字列を結合しているわけではありません。内部的には 「Filler(埋め草)」の生成と、「元の文字列」の結合 を計算量的に効率よく行うように設計されています。
もし `targetLength` が元の文字列の長さ以下であれば、何もせずに元の文字列を返します。これが非常に重要で、無駄なメモリ確保やオブジェクト生成を回避してくれています。ブラウザのエンジン(V8など)は、この「何もしない」という判断を極めて高速に行うよう最適化されています。
現場のエンジニアが意識すべきは、「どれだけ大きな値を渡しても、JavaScriptエンジンが賢く処理してくれる」 という信頼感です。余計な計算を自分で書くより、標準APIに任せる方が、パフォーマンス面でも安全なのです。
—
3. 実践:UIデザインを美しく保つための「攻め」の活用法
単なる数値整形だけでなく、UIの「安定感」を出すために活用するケースを紹介します。
A. IDの桁揃え(視認性の向上)
データベースから抽出したIDが、桁数によってバラバラに表示されると、UIは途端に安っぽく見えます。
const ids = [1, 42, 999, 1024];
// 固定長IDの生成:ダッシュボードやログ表示で非常に有効
const displayIds = ids.map(id => `ID-${String(id).padStart(6, ‘0’)}`);
console.log(displayIds);
// [“ID-000001”, “ID-000042”, “ID-000999”, “ID-001024”]
B. マスク処理(セキュリティUI)
個人情報の一部を隠すときにも `padEnd` が役立ちます。
const cardNumber = “1234”;
// 下4桁以外を伏せるような表現
const masked = cardNumber.padStart(16, ”);
console.log(masked);
// “1234″
—
4. 知っておくべき「落とし穴」とベストプラクティス
最後に、シニアとしてのアドバイスを一つ。
`padString` には単一の文字だけでなく、文字列全体を渡すことも可能です。
const name = “Alice”;
console.log(name.padEnd(10, “.-.”));
// “Alice.-.-.”
このように、`padString` は繰り返して埋め込まれます。しかし、あまり複雑な文字列をここに入れると、コードの意図が読み取りにくくなります。「何で埋めているのか」がパッと見て分からない場合は、潔くコメントを残すか、定数化して意味を持たせましょう。
まとめ:道具を正しく使えば、コードは「語る」
文字列の操作は、JavaScriptの基礎中の基礎です。だからこそ、ここをどれだけ綺麗に書けるかで、そのエンジニアの成熟度が透けて見えます。
- `padStart` / `padEnd` は、if文の排除による保守性向上に貢献する
- ブラウザの最適化を信じて、標準APIを積極的に使う
- 数値データは必ず `String()` でラップしてから処理する(型安全の意識)
明日からの実装で、もし文字列を「手動で結合」している箇所を見つけたら、ぜひこのメソッドに置き換えてみてください。それだけで、あなたのコードは一段と洗練されたものになるはずです。
それでは、良いコーディングライフを!

コメント