こんにちは!JavaScriptの世界へようこそ。
フロントエンドの荒波を乗りこなすチーフアーキテクトとして、今日は皆さんが意外と見落としがちな「文字列の裏側」にある、ちょっと優しくて深いお話をしましょう。
プログラミングを始めたばかりの頃、文字列って「ただの文字の集まり」に見えますよね。でも、JavaScriptという言語は、この文字列をとても丁寧に、そして少しだけ特別な方法で扱っているんです。
今日は、「文字列のイテレータプロトコル」という、名前だけ聞くと難しそうな概念を、お買い物の流れに例えて紐解いていきます。肩の力を抜いて読んでくださいね。
—
文字列は「魔法のレシート」?
皆さんがスーパーでお買い物をしたとき、レシートを想像してみてください。レシートには、買った商品が1行ずつ、上から順番に並んでいますよね。
JavaScriptの文字列もこれと全く同じです。
`”Hello”` という文字列は、`H`、`e`、`l`、`l`、`o` という商品が順番に並んだレシートのようなもの。
この「上から順番に一つずつ取り出せる仕組み」のことを、専門用語で「イテラブル(反復可能)」と呼びます。そして、その取り出す作業を自動でやってくれるのが `for…of` ループなんです。
実際に見てみよう
まずは、基本のコードです。エディタに貼り付けて試してみてください。
const myString = “JavaScript”;
// for…of ループは「レシートを上から順にめくる」作業です
for (const char of myString) {
console.log(char); // 順番に「J」「a」「v」「a」…と表示されます
}
どうですか?驚くほどシンプルですよね。`for…of` は、文字列を自動的に「一文字ずつ」に分解して、私たちがわざわざ「次は何番目の文字?」と数えなくても、全部終わるまで面倒を見てくれるんです。
—
現場でつまずく「サロゲートペア」という落とし穴
さて、ここからが本題です。実は、JavaScriptの世界には「見た目には一文字なのに、コンピュータの中では二つ分の場所を使っている」という、ちょっと食いしん坊な文字たちがいます。
例えば、絵文字です。`🍎`(リンゴ)や `👨👩👧`(家族の絵文字)などがこれに当たります。これを専門用語で「サロゲートペア」と呼びます。
なぜこれが問題なの?
昔のプログラミング言語は、文字を「半角英数字一文字=1つの箱」と決めていました。でも、世界中の絵文字や難しい漢字を扱うには、その箱が足りなくなってしまったんです。そこで、「2つの箱を合体させて、1つの大きな文字として扱おう!」という工夫が生まれました。
もし、古いやり方(`for`ループなど)で無理やり数えようとすると、この「合体している箱」をバラバラに引き裂いてしまうことになり、文字化けやプログラムのバグを引き起こす原因になります。
でも、大丈夫。`for…of` はそれを知っています。
`for…of` の優しさ
`for…of` は、この「サロゲートペア」の仕組みを理解しています。たとえ絵文字が混ざっていても、ちゃんと「これは一つの文字だね」と認識して、正しい単位で取り出してくれるんです。
const complexString = “リンゴ🍎が好き”;
// for…of なら、絵文字も一文字として綺麗に扱えます
for (const char of complexString) {
console.log(char);
}
// 出力結果:
// リ
// ン
// ゴ
// 🍎 <-- ここでバラバラにならず、ちゃんと1つの塊として表示されます!
// が
// 好
// き
もしこれが昔ながらの `for (let i = 0; i < str.length; i++)` だと、絵文字のところで妙な記号が出てきたりして、頭を抱えることになります。`for...of` を使えば、そんな心配は無用。とても安全なんです。
---
まとめ:仕組みを知れば怖くない
JavaScriptの文字列操作は、最初は「`slice` で切ったり、`replace` で置き換えたり」という機能ばかりに目が行きがちです。でも、今回お話しした「`for…of` で一つずつ丁寧に扱う」という感覚は、実は中級者や上級者への第一歩なんです。
1. 文字列は、順番に取り出せる「レシート」のようなもの。
2. `for…of` は、そのレシートを安全に、一文字ずつめくってくれる優秀な助手。
3. 絵文字(サロゲートペア)が出てきても、`for…of` ならバラバラにせず守ってくれる。
プログラミングをしていると、思うように動かなくて悔しい夜もあるかもしれません。でも、今日覚えたこの「文字を大切に扱う感覚」があれば、きっと大丈夫です。
何か分からないことがあったら、いつでもまた聞きに来てくださいね。皆さんのコードが、今日も明日もエラーなく、優しく動きますように!

コメント