【もじれつ】
文字列 とは?
最終更新:
💡 文字をビーズのように一列につないだテキストデータ
文字を並べたテキストデータを扱う型や値。空の文字列もある。表し方や長さの数え方は言語によって異なり、JavaScriptのlengthはUTF-16コード単位の数を返す。
📌 このページのポイント
- 文章・名前・数字の表記など、テキストを扱うための値
- JavaScriptではシングルクォートやダブルクォートで文字列を記述できる
- JavaScriptの文字列は不変。大文字への変換などは結果の値を返す
- lengthの値、コードポイント数、見た目の文字のまとまりは区別する
クォートも文字列の一部なの?
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」 = ひも、一連のもの
💬 文字をひもでつないだビーズのように考えると分かりやすいよ。この比喩は、実際のメモリ配置や文字数の数え方を表すものではないよ。