【JavaScript】charAt の使い方|文字列から1文字を取得・ブラケット記法 / at() との違い・サロゲートペア対応まで解説

charAt は文字列の指定したインデックスにある 1 文字を返すメソッドです。先頭文字の取得、文字列のループ処理、入力値の先頭判定など、文字単位の操作で頻繁に使います。この記事では charAt の基本から、ブラケット記法(str[i])や ES2022 の at() との違い、サロゲートペアの注意点まで解説します。

この記事でわかること
・charAt の基本構文と戻り値
・先頭・末尾の文字を取得する方法
・範囲外のインデックスを指定したときの挙動
・ブラケット記法 str[i] との違い
・ES2022 の at() メソッドで負のインデックスに対応
・charCodeAt / codePointAt との関係
・サロゲートペア(絵文字)での注意点
・先頭大文字化・文字ごとの処理・パスワード強度チェックの実務パターン
スポンサーリンク

charAt の基本構文

構文
const char = str.charAt(index);
// index: 取得したい文字の位置(0 始まり、省略すると 0)
// 戻り値: 指定位置の 1 文字(文字列型)
//         範囲外の場合は空文字 ""
基本例
const str = "JavaScript";

console.log(str.charAt(0)); // "J"(先頭)
console.log(str.charAt(4)); // "S"
console.log(str.charAt(9)); // "t"(末尾)

// インデックス省略 → 0番目
console.log(str.charAt());  // "J"

先頭と末尾の文字を取得する

JavaScript
const word = "プログラミング";

// 先頭の文字
console.log(word.charAt(0)); // "プ"

// 末尾の文字
console.log(word.charAt(word.length - 1)); // "グ"

範囲外のインデックスを指定した場合

charAt は範囲外のインデックスを指定してもエラーにはならず、空文字 "" を返します

JavaScript
const str = "Hello";

console.log(str.charAt(100));  // ""(範囲外)
console.log(str.charAt(-1));   // ""(負の値)
console.log(str.charAt(NaN));  // "H"(NaN → 0 として扱われる)
インデックス 動作
0 〜 length-1 対応する 1 文字を返す
length 以上 空文字 "" を返す
負の値 空文字 "" を返す
省略・NaN 0 として扱われる

charAt とブラケット記法(str[i])の違い

文字列から 1 文字を取得するには charAt(i) のほかに str[i] というブラケット記法も使えます。多くの場合は同じ結果ですが、範囲外のときの戻り値が異なります。

比較項目 charAt(i) str[i]
戻り値(正常時) 1 文字の文字列 1 文字の文字列
範囲外の戻り値 空文字 "" undefined
負のインデックス 空文字 "" undefined
書式 メソッド呼び出し プロパティアクセス
ブラウザ対応 ES1(全ブラウザ) ES5+(IE8+)
JavaScript
const str = "ABC";

// 正常時: 同じ結果
console.log(str.charAt(0)); // "A"
console.log(str[0]);        // "A"

// 範囲外: 戻り値が異なる
console.log(str.charAt(10)); // ""(空文字)
console.log(str[10]);        // undefined

// 条件分岐での影響
if (str.charAt(10)) { /* 空文字は falsy → 実行されない */ }
if (str[10]) { /* undefined も falsy → 実行されない */ }
実務ではどちらを使っても問題ありませんが、str[i] の方がコードが短く直感的です。範囲外の判定で空文字と undefined を区別する必要がある場合は charAt が適しています。

ES2022 の at() メソッド(負のインデックス対応)

ES2022 で追加された at() メソッドは、charAt やブラケット記法と同じく 1 文字を返しますが、負のインデックスに対応している点が大きな利点です。

JavaScript
const str = "JavaScript";

// 正のインデックス: charAt と同じ
console.log(str.at(0));  // "J"
console.log(str.at(4));  // "S"

// 負のインデックス: 末尾からの位置
console.log(str.at(-1)); // "t"(末尾)
console.log(str.at(-6)); // "S"(末尾から6番目)

// 範囲外: undefined を返す
console.log(str.at(100)); // undefined
比較項目 charAt(i) str[i] at(i)
負のインデックス × → 空文字 × → undefined ○ → 末尾から
範囲外の戻り値 空文字 "" undefined undefined
配列でも使える ×
ブラウザ対応 ES1 ES5+ ES2022(IE 非対応)

末尾の文字を取得するなら str.at(-1) が最もシンプルです。

末尾の文字を取得する3つの方法
const str = "Hello";

// charAt: length - 1 を計算する必要がある
console.log(str.charAt(str.length - 1)); // "o"

// ブラケット記法: 同じく length - 1
console.log(str[str.length - 1]); // "o"

// at(): 負のインデックスで簡潔
console.log(str.at(-1)); // "o"

charCodeAt / codePointAt との関係

charAt が「文字」を返すのに対し、charCodeAtcodePointAt は「文字コード(数値)」を返します。

メソッド 戻り値 サロゲートペア
charAt(i) 1 文字(文字列) 半分だけ返す可能性あり
charCodeAt(i) UTF-16 コードユニット(0〜65535) 半分だけ返す
codePointAt(i) Unicode コードポイント(0〜1114111) 正しく返す
JavaScript
const str = "A";

console.log(str.charAt(0));      // "A"
console.log(str.charCodeAt(0));  // 65(UTF-16 コード)
console.log(str.codePointAt(0)); // 65(Unicode コードポイント)

サロゲートペア(絵文字)での注意点

絵文字や一部の漢字は内部的に 2 つの UTF-16 コードユニットで構成されるため(サロゲートペア)、charAt で取得すると半分の文字(壊れた文字)が返ることがあります。

JavaScript
const emoji = "?";

console.log(emoji.length);     // 2(UTF-16で2ユニット)
console.log(emoji.charAt(0));  // "\ud83c"(壊れた文字)
console.log(emoji.charAt(1));  // "\udf89"(壊れた文字)

// 正しく取得する方法
console.log([...emoji][0]);    // "?"(スプレッド構文で文字単位に分割)
console.log(emoji.at(0));      // "\ud83c"(at も UTF-16 ベース)

サロゲートペアを正しく扱うには、for...of やスプレッド構文 [...str] で文字単位の配列に変換するのが確実です。

サロゲートペア対応の1文字取得
function charAtSafe(str, index) {
  const chars = [...str]; // 文字単位に分割
  return chars[index] ?? "";
}

console.log(charAtSafe("Hello?World", 5)); // "?"
console.log(charAtSafe("Hello?World", 6)); // "W"
charAt・ブラケット記法・at() はすべて UTF-16 コードユニット単位で動作します。絵文字を含む文字列を扱う場合は、スプレッド構文や for...of で文字単位に変換してから処理してください。

実務でよく使うパターン

先頭文字を大文字にする(capitalize)

JavaScript
function capitalize(str) {
  if (!str) return str;
  return str.charAt(0).toUpperCase() + str.slice(1);
}

console.log(capitalize("hello")); // "Hello"
console.log(capitalize("javaScript")); // "JavaScript"

文字列を 1 文字ずつ処理する

JavaScript
const str = "Hello";

// charAt + for ループ
for (let i = 0; i < str.length; i++) {
  console.log(str.charAt(i));
}

// for...of(サロゲートペア対応・推奨)
for (const char of str) {
  console.log(char);
}

イニシャルを取得する

JavaScript
function getInitials(fullName) {
  return fullName
    .split(" ")
    .map(name => name.charAt(0).toUpperCase())
    .join("");
}

console.log(getInitials("tanaka taro"));  // "TT"
console.log(getInitials("John Smith"));   // "JS"

パスワードの強度チェック

JavaScript
function checkPasswordStrength(password) {
  let score = 0;

  for (let i = 0; i < password.length; i++) {
    const code = password.charCodeAt(i);
    if (code >= 65 && code <= 90)  score |= 1; // 大文字
    if (code >= 97 && code <= 122) score |= 2; // 小文字
    if (code >= 48 && code <= 57)  score |= 4; // 数字
  }

  if (password.length >= 8 && score === 7) return "強い";
  if (password.length >= 6 && score >= 3) return "普通";
  return "弱い";
}

console.log(checkPasswordStrength("Abc12345")); // "強い"
console.log(checkPasswordStrength("abc"));      // "弱い"

関連記事

よくある質問

QcharAt と str[i] はどちらを使うべきですか?
A実務ではどちらでも構いません。str[i] の方がコードが短く主流です。違いは範囲外のときの戻り値だけで、charAt は空文字 ""、ブラケット記法は undefined を返します。
Q末尾の文字を取得する最も簡単な方法は?
AES2022 以降なら str.at(-1) が最も簡潔です。IE 対応が必要な場合は str.charAt(str.length - 1) または str[str.length - 1] を使ってください。
QcharAt で絵文字が正しく取得できません。
A絵文字はサロゲートペア(UTF-16 で 2 ユニット)のため、charAt では半分の文字が返されます。[...str][index] のようにスプレッド構文で文字単位の配列に変換してから取得すると正しく動作します。
QcharAt で文字コードを取得できますか?
AcharAt は「文字(文字列型)」を返します。文字コードが必要な場合は charCodeAt(i)(UTF-16 コード)または codePointAt(i)(Unicode コードポイント)を使ってください。
QcharAt は配列にも使えますか?
Aいいえ、charAt は String のメソッドで配列には使えません。配列の要素にアクセスするには arr[i] または arr.at(i) を使います。

まとめ

charAt は文字列の指定位置から 1 文字を取得するシンプルなメソッドです。

  • 基本: str.charAt(i) でインデックス i の 1 文字を返す
  • 範囲外: エラーにならず空文字 "" を返す
  • ブラケット記法: str[i] でも同じ結果(範囲外は undefined)
  • at(): 負のインデックスで末尾から取得可能(ES2022)
  • サロゲートペア: charAt は UTF-16 単位のため絵文字に注意

先頭大文字化やイニシャル取得など、charAt を使う実務パターンは豊富です。末尾の文字取得には at(-1)、絵文字を含む場合はスプレッド構文と使い分けてください。