String
Baseline
広く利用可能
*
この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2015年7月以降、すべてのブラウザーで利用可能です。
* この機能の一部は、対応レベルが異なる場合があります。
String オブジェクトは文字の並びを表したり操作したりするために使用されます。
解説
文字列は、テキスト形式で表現可能なデータを保持するのに便利です。最もよく使われる操作として、文字列の長さをチェックする length プロパティ、 文字列に対する + および += 演算子を用いた文字列の連結、文字列の中の部分文字列の存在や位置をチェックする indexOf() メソッド、部分文字列を取り出す substring() メソッドが挙げられます。
文字列の生成
文字列は文字列リテラルからプリミティブとして、または String() コンストラクターを使用してオブジェクトとして生成することができます。
const string1 = "文字列プリミティブ";
const string2 = 'これも文字列プリミティブ';
const string3 = `別な文字列プリミティブ`;
const string4 = new String("文字列オブジェクト");
文字列プリミティブと文字列オブジェクトは多くの動作を共有していますが、その他に重要な相違点と注意点があります。 下記の「文字列プリミティブと String オブジェクト」を参照してください。
文字列リテラルは単一引用符または二重引用符を使用して指定することができ、どちらでも同様に扱われますが、逆引用符文字 ` を使用することもできます。最後の形はテンプレートリテラルを指定しています。この形式では式を補完することができます。文字列リテラルの構文については、字句文法を参照してください。
文字へのアクセス
文字列内の個々の文字へのアクセス方法には、2 通りの方法があります。そのひとつは charAt() メソッドです。
"ねこ".charAt(1); // "こ" が返される
他にも、文字列を配列風のオブジェクトとして扱い、個々の文字を数値インデックスに対応させる方法もあります。
"ねこ"[1]; // "こ" が返される。
ブラケット記法を使用した文字アクセスでは、これらのプロパティに値を設定したり削除したりすることはできません。関連するプロパティを書き込んだり設定したりすることもできません。(より詳細な情報は Object.defineProperty() を参照してください。)
文字列の比較
文字列を比較するには小なり / 大なり演算子を用います。
const a = "a";
const b = "b";
if (a < b) {
// true
console.log(`${a} は ${b} より小さい`);
} else if (a > b) {
console.log(`${a} は ${b} より大きい`);
} else {
console.log(`${a} と ${b} は等しい`);
}
なお、すべての比較演算子は、=== および == を含め、文字列を大文字小文字を区別して比較します。文字列の大文字小文字を区別せずに比較する一般的な方法は、両方の文字列を同じ種類(大文字または小文字)に変換してから比較することです。
function areEqualCaseInsensitive(str1, str2) {
return str1.toUpperCase() === str2.toUpperCase();
}
toUpperCase() と toLowerCase() のどちらで変換するかはほとんど自由ですが、ラテン文字以外に広げると、どちらが完全に堅牢なとは言えません。例えば、ドイツ語の小文字 ß と ss は toUpperCase() によってどちらも SS に変換されますが、トルコ語の文字 ı は toLocaleLowerCase("tr") を使用しない限り、 toLowerCase() によって I と等しくない文字として誤って報告されてしまいます。
const areEqualInUpperCase = (str1, str2) =>
str1.toUpperCase() === str2.toUpperCase();
const areEqualInLowerCase = (str1, str2) =>
str1.toLowerCase() === str2.toLowerCase();
areEqualInUpperCase("ß", "ss"); // true; should be false
areEqualInLowerCase("ı", "I"); // false; should be true
ロケールを意識して大文字と小文字を区別せずに比較するための堅牢な解決策は、Intl.Collator API を使用するか、文字列の localeCompare() メソッド(インターフェイスは同じです)を sensitivity オプションで "accent" または "base" に設定します。
const areEqual = (str1, str2, locale = "en-US") =>
str1.localeCompare(str2, locale, { sensitivity: "accent" }) === 0;
areEqual("ß", "ss", "de"); // false
areEqual("ı", "I", "tr"); // true
localeCompare() メソッドは strcmp() と同様の方法で文字列を比較することができます。ロケールを意識した方法で文字列を並べ替えることができます。
文字列プリミティブと String オブジェクト
JavaScript では、 String オブジェクトとプリミティブ文字列は区別されることに注意してください。(Boolean や Number にも同じことが言えます。)
文字列リテラル(二重引用符または単一引用符で示されます)、および String 関数をコンストラクター以外の場面で(すなわち new キーワードを使わずに)呼び出した場合はプリミティブの文字列になります。
文字列プリミティブに対してメソッドを呼び出したり、プロパティを参照したりするコンテキストでは、JavaScript は自動的に文字列プリミティブをラップし、ラッパーオブジェクトに対してメソッドを呼び出したり、プロパティを参照したりします。