JavaScript | 文字列の中から、指定した位置の1文字を取り出す(charAt メソッド)

JavaScript JavaScript
スポンサーリンク

では プログラミング初心者向け にかみ砕いて、たっぷり例題と解説をつけて説明します。要点はシンプルなので、動かしながら覚えていきましょう。


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 の charAtUTF-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.lengths.charAt(1) の挙動を説明せよ。

答えと解説

  • s.length4(内部的に絵文字が 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.fromfor...ofcodePointAt などを検討。
タイトルとURLをコピーしました