JavaScriptの文字列オブジェクト

0 株式
0
0
0
0

導入

 

文字列は、テキストとして表現できるデータを格納するのに便利です。文字列に対して最もよく使用される操作としては、長さのチェック、文字列演算子 + と += を使用した文字列の構築と連結、indexOf() メソッドを使用した部分文字列の存在または位置の確認、substring() メソッドを使用した部分文字列の抽出などがあります。.

文字列の作成

文字列は、文字列リテラルからプリミティブに作成することも、String() コンストラクターを使用してオブジェクトとして作成することもできます。

const string1 = "A string primitive";
const string2 = 'Also a string primitive';
const string3 = `Yet another string primitive`;
const string4 = new String("A String object");

文字列プリミティブと文字列オブジェクトは多くの共通した動作を共有していますが、他にも重要な違いや注意点があります。以下の「文字列プリミティブと文字列オブジェクト」を参照してください。.

文字列リテラルは、一重引用符または二重引用符(どちらも同じように扱われます)を使用するか、バッククォート文字 ` を使用して指定できます。後者の形式は実際のパターンを指定します。この形式を使用して式を挿入できます。文字列リテラルの構文の詳細については、「字句構文」を参照してください。.

キャラクターアクセス

文字列内の文字にアクセスする方法は2つあります。1つ目はcharAt()メソッドです。

"cat".charAt(1); // gives value "a"

もう 1 つの方法は、文字列を配列のようなオブジェクトとして考え、個々の文字が数値インデックスに対応することです。

"cat"[1]; // gives value "a"

括弧記法を使用して文字にアクセスする場合、これらのプロパティの削除や値の代入は失敗します。これらのプロパティは書き込みも設定もできません。(詳細についてはObject.defineProperty()を参照してください。)

文字列の比較

文字列を比較するには、小なり演算子と大なり演算子を使用します。

const a = "a";
const b = "b";
if (a < b) {
// true
console.log(`${a} is less than ${b}`);
} else if (a > b) {
console.log(`${a} is greater than ${b}`);
} else {
console.log(`${a} and ${b} are equal.`);
}

=== や == を含むすべての比較演算子は、大文字と小文字を区別して文字列を比較することに注意してください。大文字と小文字を区別して文字列を比較する一般的な方法は、比較する前に両方を同じ文字(大文字または小文字)に変換することです。.

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() メソッド (これらは同じインターフェイスを持ちます) を使用し、感度オプションを「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() と同様の方法で文字列を比較できます。これにより、ロケールを考慮した方法で文字列を並べ替えることができます。.

プリミティブ文字列と文字列オブジェクト

JavaScript では文字列オブジェクトとプリミティブ文字列値が区別されることに注意してください。(これはブール値と数値にも当てはまります。)

文字列リテラル(二重引用符または一重引用符で区切られた文字列)と、非構築的なコンテキスト(つまり、new キーワードを使用せずに呼び出された文字列)での文字列呼び出しから返される文字列は、プリミティブ文字列です。プリミティブ文字列に対してメソッドが呼び出される、またはプロパティ参照が発生するコンテキストでは、JavaScript は自動的にプリミティブ文字列をラップし、メソッドを呼び出すか、代わりにラッパーオブジェクトに対してプロパティ参照を実行します。.

const strPrim = "foo"; // A literal is a string primitive
const strPrim2 = String(1); // Coerced into the string primitive "1"
const strPrim3 = String(true); // Coerced into the string primitive "true"
const strObj = new String(strPrim); // String with new returns a string wrapper object.

console.log(typeof strPrim); // "string"
console.log(typeof strPrim2); // "string"
console.log(typeof strPrim3); // "string"
console.log(typeof strObj); // "object

プリミティブ文字列と文字列オブジェクトは、eval() を使用した際に異なる結果を返します。eval に渡されるプリミティブはソースコードとして扱われます。オブジェクトを返すことで、文字列オブジェクトは他のオブジェクトと同様に扱われます。例えば、次のようになります。

const s1 = "2 + 2"; // creates a string primitive
const s2 = new String("2 + 2"); // creates a String object
console.log(eval(s1)); // returns the number 4
console.log(eval(s2)); // returns the string "2 + 2"

これらの理由により、プリミティブ文字列を期待しているときに文字列オブジェクトに遭遇するとコードが壊れる可能性がありますが、一般に、作成者はその区別を気にする必要はありません。.

String オブジェクトは、valueOf() メソッドを使用して、いつでも元のオブジェクトに変換できます。.

console.log(eval(s2.valueOf())); // returns the number 4

文字列の強制

文字列を想定する多くの組み込み操作は、まず引数を文字列にキャストします(これがStringオブジェクトがプリミティブ文字列のように動作する理由です)。これらの操作は以下のようにまとめられます。

  • 文字列はそのまま返されます。.
  • Undefined は「undefined」になります。.
  • null は「空」になります。.
  • 真は「真」になり、偽は「偽」になります。.
  • 数値はtoString(10)と同じアルゴリズムで変換されます。.
  • BigIntはtoString(10)と同じアルゴリズムで変換されます。.
  • シンボルは TypeError を発生させます。.
  • オブジェクトはまず、[Symbol.toPrimitive]()(ヒントとして「string」を使用)、toString()、valueOf()メソッドをそれぞれ呼び出してプリミティブ型に変換されます。そして、得られたプリミティブ型は文字列に変換されます。.

JavaScript でほぼ同じ効果を実現するにはさまざまな方法があります。.

  • 文字通り: `${x}` は、埋め込まれた式に対して上記で説明した文字列バインディング手順を正確に実行します。.
  • String() 関数: String(x) は同じアルゴリズムを使用して x を変換しますが、Symbols は TypeError を発生せず、“Symbol(description)” を返します。ここで、description はシンボルの説明です。.
  • + 演算子の使用:“” + x は、オペランドを文字列ではなくプリミティブ型に変換します。一部のオブジェクトでは、通常の文字列変換とは全く異なる動作をします。詳細については、リファレンスページをご覧ください。.

ユースケースによっては、`${x}`(組み込みの動作を模倣するため)またはString(x)(エラーを起こさずにシンボル値を処理するため)を使用する必要があるかもしれませんが、“” + x は使用しないでください。 .

UTF-16 文字、Unicode コードポイント、書記素クラスター

文字列は基本的にUTF-16コード単位のシーケンスとして表現されます。UTF-16エンコーディングでは、各コード単位は正確に16ビットの長さです。つまり、1つのUTF-16コード単位として表現できる文字数は最大216文字、つまり65,536文字です。この文字セットは基本多言語ページ(BMP)と呼ばれ、ラテン文字、ギリシャ文字、キリル文字、そして多くの東アジア文字など、最も一般的な文字が含まれています。各コード単位は、\uに続いて正確に4桁の16進数字が続く文字列で記述できます。.

ただし、Unicode 文字セット全体は 65536 よりはるかに大きくなります。UTF-16 の追加文字は、サロゲート ペアとして保存されます。サロゲート ペアは、1 つの文字を表す 16 ビットのコード単位のペアです。曖昧さを避けるために、ペアの 2 つの部分は 0xD800 から 0xDFFF の間である必要があり、これらのコード単位は単一コード文字のエンコードには使用されません。(より正確には、先頭のサロゲート (上位サロゲート コード単位とも呼ばれます) は 0xD800 から 0xDBFF の間の値を持ち、末尾のサロゲート (下位サロゲート コード単位とも呼ばれます) は 0xDC00 から 0xDFFF の間の値を持ち、Unicode 文字を含みます。) 1 つまたは 2 つの UTF-16 コード単位で構成される文字は、Unicode コード ポイントとも呼ばれます。任意の Unicode コード ポイントは、\u{xxxxxx} を使用して文字列に記述できます。ここで、xxxxxx は 1 ~ 6 桁の 16 進数を表します。.

「単一サロゲート」とは、次のいずれかの条件を満たす 16 ビットのコード ユニットです。

  • 0xD800~0xDBFF の範囲内(つまり、先頭のサロゲート)ですが、文字列内の最後のコード単位であるか、次のコード単位が最後のサロゲートではありません。.
  • 0xDC00~0xDFFF の範囲(両端を含む)ですが(つまり、最後のサロゲート)、文字列の最初のコード単位、または前のコード単位は元のサロゲートではありません。.

単一サロゲートはUnicode文字を表しません。JavaScriptの内部メソッドのほとんどはUTF-16コード単位で動作するため、単一サロゲートを正しく処理しますが、他のシステムとやり取りする際には、通常、単一サロゲートは有効な値ではありません。例えば、 encodeURI() は単一サロゲートに対してURIEエラーをスローします。これは、URIエンコーディングがUTF-8エンコーディングを使用しているためです。UTF-8には単一サロゲート用のエンコーディングがありません。単一サロゲートを含まない文字列は整形式文字列と呼ばれ、UTF-16を扱わない関数( encodeURI() や TextEncoder など)で安全に使用できます。文字列が整形式かどうかを確認するには isWellFormed() メソッドを使用し、単一サロゲートをクリーンアップするには toWellFormed() メソッドを使用します。.

Unicode文字の上には、視覚的な単位として捉えるべき特定のUnicode文字の並びがあり、これはグラフィカルクラスタと呼ばれます。最も一般的な例は顔文字です。様々なバリエーションを持つ多くの顔文字は、実際には複数の絵文字で構成されており、通常は文字(U+200D) 一緒に結合します。.

どのレベルの文字で反復処理を行うか注意が必要です。例えば、split(“”) は UTF-16 コード単位で分割し、代替ペアを分離します。文字列のインデックスも各 UTF-16 コード単位のインデックスを参照します。一方、[Symbol.iterator]() は Unicode コードポイント単位で反復処理を行います。書記素クラスタを反復処理するには、カスタムコードが必要です。.

"😄".split(""); // ['\ud83d', '\ude04']; splits into two lone surrogates
// "Backhand Index Pointing Right: Dark Skin Tone"
[..."👉🏿"]; // ['👉', '🏿']
// splits into the basic "Backhand Index Pointing Right" emoji and
// the "Dark skin tone" emoji
// "Family: Man, Boy"
[..."👨‍👦"]; // [ '👨', '‍', '👦' ]
// splits into the "Man" and "Boy" emoji, joined by a ZWJ
// The United Nations flag
[..."🇺🇳"]; // [ '🇺', '🇳' ]
// splits into two "region indicator" letters "U" and "N".
// All flag emojis are formed by joining two region indicator letters

コンストラクタ

弦()

文字列オブジェクトを作成します。関数として呼び出されると、String型の初期値を返します。.

静的メソッド

文字列.fromCharCode()

指定された Unicode 値のシーケンスを使用して作成された文字列を返します。.

文字列.fromCodePoint()

指定されたコード ポイントのシーケンスを使用して作成された文字列を返します。.

文字列.raw()

生のパターン文字列から作成された文字列を返します。.

サンプルのプロパティ

これらのプロパティは String.prototype で定義され、すべての String インスタンスによって共有されます。.

文字列.プロトタイプ.コンストラクタ

インスタンスオブジェクトを作成するコンストラクタ関数。文字列インスタンスの場合、初期値は文字列コンストラクタです。.

これらの機能は各文字列インスタンスに固有です。.

長さ

文字列の長さを反映します。読み取り専用です。.

サンプル方法

文字列.プロトタイプ.at()

指定されたインデックス内の文字(UTF-16コード単位1つ)を返します。文字列の最後の文字から逆方向に数えた負の整数も受け入れます。.

String.prototype.charAt()

指定されたインデックス内の文字 (正確には 1 つの UTF-16 コード単位) を返します。.

String.prototype.charCodeAt()

指定されたインデックスの UTF-16 コード単位の値である数値を返します。.

String.prototype.codePointAt()

指定されたポーズから始まる UTF-16 エンコードされたコード ポイントのコード ポイント値である負でない整数を返します。.

文字列.プロトタイプ.連結()

テキストは 2 つ (またはそれ以上) の文字列を結合し、新しい文字列を返します。.

String.prototype.endsWith()

文字列が文字列 searchString の文字で終わるかどうかを判断します。.

文字列.プロトタイプ.includes()

呼び出し文字列に SearchString が含まれているかどうかを判断します。.

文字列.プロトタイプ.indexOf()

この文字列内で searchValue が最初に出現するインデックスを返します。見つからない場合は -1 を返します。.

String.prototype.isWellFormed()

この文字列に単一の置換があるかどうかを示すブール値を返します。.

String.prototype.lastIndexOf()

この文字列内で searchValue が最後に出現するインデックスを返します。見つからない場合は -1 を返します。.

String.prototype.localeCompare()

compareString によって参照される文字列が、ソート順序において指定された文字列の前、後、または等しいかどうかを示す数値を返します。.

文字列.プロトタイプ.一致()

正規表現 regexp を文字列と一致させるために使用されます。.

String.prototype.matchAll()

すべての正規表現の一致の反復子を返します。.

文字列.プロトタイプ.正規化()

Unicode 正規化形式は、呼び出し文字列の値を返します。.

String.prototype.padEnd()

現在の文字列を末尾から文字列と連結し、長さ targetLength の新しい文字列を返します。.

String.prototype.padStart()

現在の文字列の先頭から指定された文字列を埋め込み、長さ targetLength の新しい文字列を返します。.

文字列.プロトタイプ.繰り返し()

オブジェクトの要素をカウントした回数で構成される文字列を返します。.

文字列.プロトタイプ.置換()

SearchFor は、replaceWith を使用して項目を置換するために使用されます。searchFor は文字列または正規表現、replaceWith は文字列または関数です。.

String.prototype.replaceAll()

SearchFor は、replaceWith のすべての出現を置換するために使用されます。searchFor は文字列または正規表現、replaceWith は文字列または関数です。.

正規表現 regexp と呼び出し文字列間の一致を検索します。.

文字列.プロトタイプ.スライス()

文字列の一部を抽出し、新しい文字列を返します。.

文字列.プロトタイプ.分割()

呼び出し文字列を sep 文字列の部分文字列に分割して埋められた文字列の配列を返します。.

文字列.プロトタイプ.startsWith()

呼び出し文字列が searchString 文字列内の文字で始まるかどうかを判断します。.

String.prototype.substr() は非推奨です

指定されたインデックスから始まり、指定された文字数までの文字列の一部を返します。.

文字列.プロトタイプ.部分文字列()

指定されたインデックス (1 つまたは複数) から (またはその間の) 呼び出し文字列の文字を含む新しい文字列を返します。.

String.prototype.toLocaleLowerCase()

文字列内の文字は、現在のロケールを尊重しながら小文字に変換されます。.

ほとんどの言語では、これは toLowerCase() と同じ状態を返します。.

String.prototype.toLocaleUpperCase()

文字列内の文字は、現在のロケールを尊重しながら大文字に変換されます。.

ほとんどの言語では、これは toUpperCase() と同じ状態を返します。.

String.prototype.toLowerCase()

呼び出し文字列の値を小文字に変換して返します。.

String.prototype.toString()

指定されたオブジェクトを表す文字列を返します。Object.prototype.toString() メソッドをオーバーライドします。.

String.prototype.toUpperCase()

呼び出し文字列の値を大文字に変換して返します。.

String.prototype.toWellFormed()

この文字列のすべての単一出現を Unicode 置換文字 U+FFFD に置き換えた文字列を返します。.

文字列.プロトタイプ.トリム()

文字列の先頭と末尾の空白を削除します。.

String.prototype.trimEnd()

文字列の末尾を空白でトリミングします。.

String.prototype.trimStart()

文字列の先頭から空白を削除します。.

文字列.プロトタイプ.値()

指定されたオブジェクトの初期値を返します。Object.prototype.valueOf() メソッドをオーバーライドします。.

String.prototype[Symbol.iterator]()

文字列値のコード ポイントを反復処理し、各コード ポイントを文字列値として返す新しい反復子オブジェクトを返します。.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

あなたも気に入るかもしれない