JavaScript

String オブジェクト

 編集:2022.10.06 by T.A.

文字の並びを表したり操作したりするために使用されます。

解説

文字列は、テキスト形式で表現可能なデータを保持するのに便利です。最もよく使われる操作として、文字列の長さをチェックする length プロパティ、文字列に対する + および += 演算子を用いた文字列の連結、文字列の中の部分文字列の存在や位置をチェックする indexOf() メソッド、部分文字列を取り出す substring() メソッドが挙げられます。

コンストラクター
Object=new String(thing)
String=String(thing)
新しい String オブジェクトを生成するために使用します。

コンストラクターではなく関数として呼び出されたときは型変換を行うので、普通はより有用です。

静的メソッド
string=String.fromCharCode(num1[,...[,numN]])
指定された Unicode 値の列から生成した文字列を返します。
string=String.fromCodePoint(num1[,...[,numN]])
指定された Unicode コード ポイントの列から生成した文字列を返します。
string= String.raw(callSite,...substitutions)
string= String.raw`templateString`
指定オブジェクトと引数とを織り込んだ文字列を返します。

テンプレート文字列を処理して返します。

インスタンス プロパティ
number=String.length 読取専用
その String の文字列の長さを示す。
インスタンス メソッド
文字=String.charAt(index)
その String 中の指定位置にある単一の UTF-16 コード ユニットからなる文字列を返します。
number=String.charCodeAt(index)
その String 中の指定位置にある UTF-16 コード ユニットのコードを返します。
number=String.codePointAt(pos)
その String 中の指定位置の Unicode コード ポイント値である数値を返します。
string=String.concat(str1[,...strN])
その String と指定文字列の引数を連結した文字列を返します。
boolean=String.includes(searchString[,position])
その String 中に指定文字列が含まれているかを返します。
boolean=String.endsWith(searchString[,length])
その String の末尾に、指定文字列が含まれているかを返します。
number=String.indexOf(searchValue[,fromIndex])
その String 中で、指定位置から指定文字列を検索し最初に現れた位置を返します。
number=String.lastIndexOf(searchValue[,fromIndex])
その String 中で、指定位置から指定文字列を前方に検索し最初に現れた位置を返します。
number=String.localeCompare(compareString[,locales[,options]])
その String と指定文字列とを、並べ替え順において前後関係を数値で返します。
Array=String.match(regexp)
その String に対して正規表現 regexp で一致する部分を配列で返します。
イテレーター=String.matchAll(regexp)
その String に対して正規表現 regexp で全てに一致する部分をイテレーターで返します。
string=String.normalize([form])
その String を Unicode 正規化形式で処理した文字列を返します。
string=String.padEnd(targetLength[,padString])
その String の尾部に指定文字列で繰り返し埋めて指定文字数分に調整した文字列を返します。

指定文字数が String の文字数よりも小さくても、元の文字列は確保されます。

string=String.padStart(targetLength[,padString])
その String の頭部に指定文字列で繰り返し埋めて指定文字数分に調整した文字列を返します。

指定文字数が String の文字数よりも小さくても、元の文字列は確保されます。

string=String.repeat(count)
その String を指定数だけコピーして結合した文字列を返します。
string=String.replace(searchFor,replaceWith)
その String 内を指定の正規表現または文字列に一致する文字列を指定文字列で置換した文字列を返します。
string=String.replaceAll(searchFor,replaceWith)
その String 内を指定の正規表現または文字列に一致する全ての文字列を指定文字列で置換した文字列を返します。
number=String.search(regexp)
その String とregexp(正規表現)との一致した位置を返します。
string=String.slice(beginIndex[,endIndex])
その文字列から、指定位置範囲の文字列を返します。
Array=String.split([sep[,limit]])
その文字列を、指定した区切り文字列で分割したものを配列として返します。
boolean=String.startsWith(searchString[,length])
その String で、指定文字列が指定位置から始まるか否か返します。
string=String.substr(start[,length])
その String の、指定位置から指定文字数分の文字列を返します。
string=String.substring(indexStart[,indexEnd])
その String の、指定位置範囲の文字列を返します。
string=String.toLocaleLowerCase()
string= String.toLocaleLowerCase(locale)
string= String.toLocaleLowerCase( [locale,locale,...])
その String を、ロケールに基づいて小文字に変換して返します。
string= String.toLocaleUpperCase()
string= String.toLocaleUpperCase(locale)
string= String.toLocaleUpperCase( [locale,locale,...])
その String を、ロケールに基づいて大文字に変換して返します。
string=String.toLowerCase()
その String を、小文字に変換したものを返します。
string=String.toString()
その String オブジェクトを表す文字列を返します。(Object.prototype.toString() メソッドを上書きします。)
string=String.toUpperCase()
その String を、大文字に変換したものを返します。
string=String.trim()
その String の頭部・尾部の空白を削除した文字列を返します。
string=String.trimStart()
その String の頭部の空白を削除した文字列を返します。
string=String.trimEnd()
その String の尾部の空白を削除した文字列を返します。
string=String.valueOf()
その String オブジェクトのプリミティブ値を返します。(Object.prototype.valueOf() メソッドを上書きします。)
イテレーター=String.@@iterator()
その String の文字列値のコード ポイントを走査し、それぞれのコード ポイントを文字列値として返すイテレーター オブジェクトを返します。
HTML ラッパーメソッド

非推奨です。これらのメソッドは避けてください。
以下のメソッドは、それぞれ、特定の HTML タグでラップされた文字列のコピーを返します。

String.anchor()→mdn
<a name="name">(ハイパーテキストのターゲット)
String.big()→mdn
<big>
String.blink()→mdn
<blink>
String.bold()→mdn
<b>
String.fixed()→mdn
<tt>
String.fontcolor()→mdn
<font color="color">
String.fontsize()→mdn
<font size="size">
String.italics()→mdn
<i>
String.link()→mdn
<a href="url">(URL へのリンク)
String.small()→mdn
<small>
String.strike()→mdn
<strike>
String.sub()→mdn
<sub>
String.sup()→mdn
<sup>

文字列の生成

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

const string1 = "文字列プリミティブ";
const string2 = 'これも文字列プリミティブ';
const string3 = `別な文字列プリミティブ`;
const string4 = new String("文字列オブジェクト");

文字列プリミティブと文字列オブジェクトは、ほとんどの場合は交換して使用することができます。下記の「文字列プリミティブと String オブジェクト」を参照してください。

文字列リテラルは単一引用符または二重引用符を使用して指定することができ、どちらでも同様に扱われますが、逆引用符文字「`」を使用することもできます。最後の形はテンプレートリテラルを指定し、この形式では式を補完することができます。

文字へのアクセス

文字列内の個々の文字へのアクセス方法には、二通りの方法があります。そのひとつは charAt() メソッドです。

return 'ねこ'.charAt(1)  // "こ" が返される

そしてもうひとつは、文字列を配列のようなオブジェクトとして扱い、数値の添字を用いる方法です。(ECMAScript 5 で導入)

return 'ねこ'[1]  // "こ" が返される。

ブラケット記法を使用した文字アクセスでは、これらのプロパティに値を設定したり削除したりすることはできません。関連したプロパティを書き込んだり設定したりすることもできません。(より詳細な情報は Object.defineProperty() を参照してください。)

文字列の比較

C 言語では 文字列の比較の為に strcmp() 関数を用います。JavaScript では単純に 小なり/大なり演算子を用います。

let a = 'a'
let b = 'b'
if (a < b) { // true
  console.log(a + ' は ' + b + ' より小さい')
} else if (a > b) {
  console.log(a + ' は ' + b + ' より大きい')
} else {
  console.log(a + ' と ' + b + ' は等しい')
}

String インスタンスから継承される localeCompare() メソッドを使用して同等の結果を得ることもできます。

なお、a == b は a と b の文字列が等しいかどうかを、通常の大文字小文字を区別して比較します。大文字小文字に関係なく比較したい場合は、次のように関数を使用してください。

function isEqual(str1,str2)
{
    return str1.toUpperCase() === str2.toUpperCase()
} // isEqual

この関数では、特定の UTF-8 文字の変換に問題があるため、小文字の代わりに大文字を使用します。

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

JavaScript では、String オブジェクトとプリミティブ文字列は区別されることに注意してください。(Boolean や Number にも同じことが言えます。)

文字列リテラル(二重引用符または単一引用符で示されます)、および String 関数をコンストラクター以外の場面で(すなわち new キーワードを使わずに)呼び出した場合はプリミティブの文字列になります。JavaScript では、必要に応じてプリミティブの文字列が自動的に String オブジェクトに変換されるので、プリミティブの文字列に対して String オブジェクトのメソッドを使用することができます。プリミティブの文字列に対して、メソッドの呼び出しやプロパティの参照が行われようとした場合、JavaScript は自動的にプリミティブの文字列をオブジェクトでラップし、メソッドを呼び出したりプロパティの参照を行ったりします。

let s_prim = 'foo'
let s_obj = new String(s_prim)

console.log(typeof s_prim) // Logs "string"
console.log(typeof s_obj)  // Logs "object"

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

let s1 = '2 + 2'              // 文字列プリミティブを生成
var s2 = new String('2 + 2')  // String オブジェクトを生成
console.log(eval(s1))         // 数値の 4 を返す
console.log(eval(s2))         // 文字列の "2 + 2" を返す

こういった理由から、プリミティブの文字列を期待して実装されたコードは String オブジェクトでうまく動作しないことがあります。しかし、一般的にはこれらの違いを考慮しなければならないことはあまりありません。

なお、String オブジェクトは valueOf() メソッドを用いることで、プリミティブの文字列に変換することができます。

console.log(eval(s2.valueOf()))  // 数値の 4 を返す
エスケープ表記

通常の文字列とは異なる特殊な文字を表示するためには、エスケープ表記を使用します。

コード 出力
\XXX XXX=1~3桁の8進数、0~377 の範囲。

ISO-8859-1 の文字または U+0000 から U+00FF の間の Unicode コード ポイントです。

\' 単一引用符
\" 二重引用符
\\ バックスラッシュ(「\」文字)
\n 改行
\r 復帰
\v 垂直タブ
\t 水平タブ
\b バックスペース
\f ページ送り
\uXXXX XXXX=4桁の16進数、0x0000~0xFFFF の範囲。

UTF-16 のコード単位/U+0000 から U+FFFF の間の Unicode コード ポイント

\u{X}\u{XXXXXX} XXXXXXX=1~6桁の16進数、0x0~0x10FFFFの範囲。

UTF-32 のコード単位/U+0000 から U+10FFFF の間の Unicode コード ポイント

\xXX XX=2桁の16進数、0x00~0xFFの範囲。

ISO-8859-1 の文字/U+0000 から U+00FF の間の Unicode コード ポイント

長い文字列リテラル

時には、コードに非常に長い文字列が含まれる場合があります。行を延々と長くしたり、エディターに任せて折り返したりするよりも、実際の文字列の内容に影響を与えずに文字列をソース コード内で複数行に分割したいことがあります。これを行うには2つの方法があります。

方法 1:

+」演算子を使用して、次のように複数の文字列を追加することができます。

let longString = "This is a very long string which needs " +
                 "to wrap across multiple lines because " +
                 "otherwise my code is unreadable."

方法 2:

各行の末尾にバックスラッシュ文字「\」を使用して、文字列が次の行に続くことを示すことができます。バックスラッシュの後に、(改行を除いて)空白やその他の文字を置いたり、インデントを置いたりしていないか確認してください。さもないと動作しません。

この形式は以下のようになります:

let longString = "This is a very long string which needs \
to wrap across multiple lines because \
otherwise my code is unreadable."

これらの結果はともに同じ文字列が生成されます。

文字列変換

String を使用すると、toString() よりも信頼性の高い代替手段となり、null、undefined、symbols に対して使用することもできます。

let outputStrings = []
for (let i = 0, n = inputValues.length; i < n; ++i) {
  outputStrings.push(String(inputValues[i]));
}
S="あいう";
D=S[1]; //="い"
S=String("あいう"); //="あいう"

S=new String("あいう"); //=[object]:あいう
	//0=[string]:あ
	//1=[string]:い
	//2=[string]:う

テスト