では プログラミング初心者向け にかみ砕いて、たっぷり例題と解説をつけて説明します。要点はシンプルなので、動かしながら覚えていきましょう。
1. charAt の基本(何をするか)
charAt は「文字列の ある位置 にある 1文字 を取り出す」ためのメソッドです。書き方はこう:
文字列.charAt(インデックス)
JavaScript- インデックスは 0 から始まります(先頭の文字は
0)。 - 指定したインデックスにある文字を 文字列(長さ1) として返します。
- インデックスが範囲外なら 空文字
""が返ります。
2. 単純な例(日本語でも同じ感覚)
let word = '花言葉';
console.log(word.charAt(0)); // -> '花'
console.log(word.charAt(1)); // -> '言'
console.log(word.charAt(2)); // -> '葉'
console.log(word.charAt(3)); // -> ''(空文字。範囲外)
JavaScript上の例:0 が先頭、2 が 3文字目、3 は文字列の長さ(3)と同じなので範囲外です。
3. 注意ポイント(初心者がハマりやすい所)
A. 「0始まり」を必ず意識する
人間の「1文字目 = 1」とは違い、プログラムでは先頭が 0 です。1文字目を取りたければ charAt(0)。
B. 範囲外を指定してもエラーにならない
例外は投げられず ""(空文字)が返ります。条件によっては空文字が混じってバグになるので、必要なら事前に str.length をチェックしましょう。
C. Emoji や一部の文字(非BMP)に注意
JS の charAt はUTF-16 の「コードユニット」単位で返します。絵文字や一部の特殊文字は内部的に サロゲートペア(2つのコードユニット) で表現されるため、見た目上は 1 文字でも charAt が返すのはその 最初(もしくは後半)の半分だけになることがあります(正しく “1文字分” を取りたいときは別の方法を使います)。
例(説明):
let s = 'A😊B'; // '😊' は内部的にサロゲートペア(2つのコードユニット)
console.log(s.charAt(0)); // 'A'
console.log(s.charAt(1)); // ここで返るのは "😊" の前半のコードユニット(見た目は壊れた文字に見えることがある)
console.log(s.charAt(2)); // '😊' の後半のコードユニット
console.log(s.charAt(3)); // 'B'
JavaScriptこのため絵文字などを扱う場合は String.prototype.codePointAt() / String.fromCodePoint() や Array.from(str) を使う方法が推奨されます。
4. すぐ試せる例題(手を動かして覚える)
例題1(基礎)
文字列 let s = "hello"; に対して、次の出力を答えよ。
a) s.charAt(0)
b) s.charAt(4)
c) s.charAt(5)
答えと解説
a) 'h' — 先頭。
b) 'o' — 0,1,2,3,4 → 5文字目が o。
c) '' (空文字)— インデックス 5 は範囲外(長さは 5)。
例題2(日本語)
let s = '東京'; に対して console.log(s.charAt(1)); の出力は?
答え
'京' — 0 が '東'、1 が '京'。
例題3(絵文字の罠)
let s = 'A😊B'; に対して s.length と s.charAt(1) の挙動を説明せよ。
答えと解説
s.lengthは 4(内部的に絵文字が 2 つのコードユニットで数えられるため)。s.charAt(1)は😊の 前半(サロゲートの1つ) を返す(見た目が壊れて表示されたり、不完全な文字になる)。
→ 絵文字を「1文字」として安全に扱いたければArray.from(s)やスプレッド[...]、[...s]、あるいはfor (const ch of s)(for-of はコードポイント単位でループ)を使うのが良い。
5. 便利な使い方(実務で役に立つワザ)
- 先頭の1文字だけ取って何か判定したいとき:
if (str.charAt(0) === '-') {
// マイナス記号が先頭にあるときの処理
}
JavaScript- 文字列をひとつずつ処理したいとき(ただし絵文字注意):
for (let i = 0; i < str.length; i++) {
console.log(str.charAt(i));
}
JavaScript※ 絵文字やサロゲートペアを正しく扱いたいなら for (const ch of str) の方が安全(for-of はコードポイント単位で繰り返す)。
6. 追加の練習問題(解答付き)
問1
let s = 'abc'; を for で回して charAt を全部出力したとき、何が表示されるか。
答え: a, b, c(各行それぞれ 'a','b','c')
問2(応用)
次のコードで console.log(arr); に入る配列は何か?
let s = 'あいう';
let arr = Array.from(s);
console.log(arr);
JavaScript答え: ['あ','い','う'](Array.from は見た目の「文字」単位で分割するため、日本語や絵文字も正しく扱える)
まとめ(覚えておくこと)
charAt(index)は インデックス(0始まり) の位置の 1つの UTF-16 コードユニット を文字列として返す。- 範囲外を指定すると 空文字
""が返る。 - 絵文字など「見た目1文字=内部で2単位」の場合は
charAtだと半分だけ取れてしまうことがある → 絵文字を扱うときはArray.from、for...of、codePointAtなどを検討。
