【もじれつ】

文字列 とは?

最終更新:
💡 文字をビーズのように一列につないだテキストデータ

文字を並べたテキストデータを扱う型や値。空の文字列もある。表し方や長さの数え方は言語によって異なり、JavaScriptのlengthはUTF-16コード単位の数を返す。

📌 このページのポイント
文字列:テキストの並びJavaScriptの "Hello"H[0]e[1]l[2]l[3]o[4]length は 5(UTF-16コード単位の数)"😀".length は 2コードポイントは 1個"é".length は 2コードポイントは 2個見た目のまとまりは、どちらも一つ
並びを表す概念図で、メモリ配置ではない。JavaScriptのlengthはUTF-16コード単位を数え、見た目の文字のまとまりとは異なる。
ひよこ ひよこ
クォートも文字列の一部なの?
ペンギン先生 ペンギン先生
JavaScriptで "Hello" と書くとき、外側のクォートは値を記述するための記号だよ。値の中身はHello。入力欄やファイルから得たテキストも文字列として扱えるので、文字列そのものが必ずクォート付きとは限らないんだ。
ひよこ ひよこ
文字が一つもなくても文字列?
ペンギン先生 ペンギン先生
あるよ。JavaScriptでは "" と書くと空の文字列で、長さは0になる。文字列がないことを表すnullやundefinedとは別の値なんだ。空欄をどの値で扱うかは、アプリの仕様に合わせよう。
ひよこ ひよこ
文字列が不変ってどういうこと?
ペンギン先生 ペンギン先生
たとえばstrが "hello" なら、str.toUpperCase()は "HELLO" を返すけれど、元の値は "hello" のままだよ。変数strに結果を持たせたいなら、再代入できる変数でstr = str.toUpperCase()のように代入し直すんだ。
ひよこ ひよこ
数字の1と文字列の "1" は違うの?
ペンギン先生 ペンギン先生
違う型の値だよ。JavaScriptで1 + 2は3だけれど、"1" + "2" は連結した "12" になる。文字列を数として扱うなら、Number()などで変換し、変換できる内容かも確認しよう。
ひよこ ひよこ
lengthで絵文字も一文字として数えられる?
ペンギン先生 ペンギン先生
JavaScriptのlengthはUTF-16コード単位の数で、"😀" は2になる。スプレッド構文で数えるコードポイントは1だけれど、eと結合アクセントを組み合わせた "é" はコードポイントが2個で、一つのアクセント付き文字に見える。どれを文字数と呼ぶかを決める必要があるんだ。
もっと詳しく知りたい人へ

見た目の文字のまとまりを数えたいときは?

対応するJavaScript環境では、Intl.Segmenterにgranularity: "grapheme"を指定して分割する方法があるよ。たとえば [...new Intl.Segmenter("ja", {granularity: "grapheme"}).segment("é")].length は1になる。ここでeに続く結合アクセントは一緒に一つの書記素として扱われる。用途に必要な文字数の定義と、対象環境での対応を確認しよう。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「文字列」って出てきたら「文字を並べたテキストデータ」と思えばだいたいOK!
📖 おまけ:英語の意味
「string」 = ひも、一連のもの
💬 文字をひもでつないだビーズのように考えると分かりやすいよ。この比喩は、実際のメモリ配置や文字数の数え方を表すものではないよ。

参考資料

← 用語集にもどる