String
String
オブジェクトは文字の並びを表したり操作したりするために使用されます。
解説
文字列は、テキスト形式で表現可能なデータを保持するのに便利です。最もよく使われる操作として、文字列の長さをチェックする length
プロパティ、 文字列に対する + および += 演算子を用いた文字列の連結、文字列の中の部分文字列の存在や位置をチェックする indexOf()
メソッド、部分文字列を取り出す substring()
メソッドが挙げられます。
文字列の生成
文字列は文字列リテラルからプリミティブとして、または 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} (X…XXXXXX = 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()
-
新しい
String
オブジェクトを生成するために使用します。コンストラクターではなく関数として呼び出されたときは型変換を行うので、普通はより有用です。
静的メソッド
String.fromCharCode(num1 [, ...[, numN]])
-
指定された Unicode 値の列から生成した文字列を返します。
String.fromCodePoint(num1 [, ...[, numN)
-
指定された Unicode コードポイントの列から生成した文字列を返します。
String.raw()
-
生のテンプレート文字列から生成した文字列を返します。
インスタンスプロパティ
String.prototype.length
-
文字列の
length
を反映します。読み取り専用です。
インスタンスメソッド
String.prototype.charAt(index)
-
index
で指定された位置の文字 (UTF-16 コード 1 つから成ります) を返します。 String.prototype.charCodeAt(index)
-
index
で与えられた位置の文字の UTF-16 の値を示す数を返します。 String.prototype.codePointAt(pos)
-
pos
で指定された位置から始まる UTF-16 エンコードされた際のコードポイントの、コードポイントの値である正の整数を返します。 String.prototype.concat(str [, ...strN ])
-
2 つ (以上) の文字列を連結し、新しい文字列を返します。
String.prototype.includes(searchString [, position])
-
文字列中に
searchString
が含まれているかを返します。 String.prototype.endsWith(searchString [, length])
-
文字列の末尾に指定された文字列
searchString
が含まれているかを返します。 String.prototype.indexOf(searchValue [, fromIndex])
-
呼び出す
String
オブジェクト中で、searchValue
が最初に現れる位置を返します。見つからなかった場合は-1
を返します。 String.prototype.lastIndexOf(searchValue [, fromIndex])
-
呼び出す
String
オブジェクト中で、searchValue
が最後に現れる位置を返します。見つからない場合は-1
を返します。 String.prototype.localeCompare(compareString [, locales [, options]])
-
参照文字列
compareString
が、並べ替え順において、与えられた文字列の前になるか後になるか、あるいは、同じかどうかを示す数値を返します。 String.prototype.match(regexp)
-
文字列に対して正規表現
regexp
を一致させるために使用されます。 String.prototype.matchAll(regexp)
-
regexp
が一致するものすべてのイテレーターを返します。 String.prototype.normalize([form])
-
呼び出された文字列の値の Unicode 正規化形式を返します。
String.prototype.padEnd(targetLength [, padString])
-
現在の文字列の末尾から指定された文字列で埋めた、長さ
targetLength
文字の新たな文字列を返します。 String.prototype.padStart(targetLength [, padString])
-
現在の文字列の先頭から指定した文字列で埋めた、長さ
targetLength
文字の新たな文字列を作成します。 String.prototype.repeat(count)
-
オブジェクトの要素を
count
回繰り返した文字列を返します。 String.prototype.replace(searchFor, replaceWith)
-
searchFor
が現れたところをreplaceWith
で置換するために使用します。searchFor
は文字列または正規表現であり、replaceWith
は文字列または関数です。 String.prototype.replaceAll(searchFor, replaceWith)
-
searchFor
が現れたところすべてをreplaceWith
で置換するために使用します。searchFor
は文字列または正規表現であり、replaceWith
は文字列または関数です。 String.prototype.search(regexp)
-
正規表現
regexp
と呼び出された文字列が一致するところを検索します。 String.prototype.slice(beginIndex[, endIndex])
-
文字列の一区間を取り出し、新しい文字列を返します。
String.prototype.split([sep [, limit] ])
-
呼び出した文字列を、部分文字列
sep
が現れるところで分割し、文字列の配列を生成して返します。 String.prototype.startsWith(searchString [, length])
-
呼び出した文字列が文字列
searchString
で開始されているかを判断します。 String.prototype.substr()
-
文字列において、指定された位置から指定された文字数の文字を返します。
String.prototype.substring(indexStart [, indexEnd])
-
呼び出した文字列の指定された位置以降 (または区間) にある文字が入った新しい文字列を返します。
String.prototype.toLocaleLowerCase( [locale, ...locales])
-
文字列内の文字が、現在のロケールに沿って小文字に変換されます。
ほとんどの言語では、これは
toLowerCase()
と同じものを返します。 String.prototype.toLocaleUpperCase( [locale, ...locales])
-
文字列内の文字が、現在のロケールに沿って大文字に変換されます。
ほとんどの言語では、これは
toUpperCase()
と同じものを返します。 String.prototype.toLowerCase()
-
小文字に変換された文字列の値を呼び出して返します。
String.prototype.toString()
-
指定されたオブジェクトの文字列を返します。
Object.prototype.toString()
メソッドを上書きします。 String.prototype.toUpperCase()
-
大文字に変換された文字列の値を呼び出して返します。
String.prototype.trim()
-
文字列の先頭と末尾にある空白を削除します。 ECMAScript 5 標準の一部です。
String.prototype.trimStart()
-
文字列の先頭にある空白を削除します。
String.prototype.trimEnd()
-
文字列の末尾にある空白を削除します。
String.prototype.valueOf()
-
指定されたオブジェクトのプリミティブ値を返します。
Object.prototype.valueOf()
メソッドを上書きします。 String.prototype.@@iterator()
-
文字列値のコードポイントを反復処理し、文字列値として各コードポイントを返す、新しい
Iterator
オブジェクトを返します。
HTML ラッパーメソッド
メモ: 非推奨です。これらのメソッドは避けてください。
以下のメソッドは、それぞれ、特定の HTML タグでラップされた文字列のコピーを返します。
String.prototype.anchor()
-
<a name="name">
(ハイパーテキストのターゲット) String.prototype.big()
<big>
String.prototype.blink()
<blink>
String.prototype.bold()
<b>
String.prototype.fixed()
<tt>
String.prototype.fontcolor()
String.prototype.fontsize()
String.prototype.italics()
<i>
String.prototype.link()
-
<a href="url">
(URL へのリンク) String.prototype.small()
<small>
String.prototype.strike()
<strike>
String.prototype.sub()
<sub>
String.prototype.sup()
<sup>
例
文字列変換
String
を使用すると、 toString()
よりも信頼性の高い代替手段となり、 null
, undefined
, symbols
に対して使用することもできます。
let outputStrings = []
for (let i = 0, n = inputValues.length; i < n; ++i) {
outputStrings.push(String(inputValues[i]));
}
仕様書
Specification |
---|
ECMAScript Language Specification # sec-string-objects |
ブラウザーの互換性
BCD tables only load in the browser