この記事は編集レビューを必要としています。ぜひご協力ください。
概要
String
グローバルオブジェクトは文字列のコンストラクタ、または文字列シーケンスです。
構文
String リテラルは次の様な形をとります。
'string text' "string text"
String
グローバルオブジェクトを直接的に利用する際には、次の形をとります。
String(thing) new String(thing)
引数
thing
- 文字列に変換する対象
テンプレートリテラル
ECMAScript 6から、String リテラルには テンプレートリテラル が追加されました。
`hello world`
`hello!
world!`
`hello ${who}`
escape `<a>${who}</a>`
エスケープシーケンス
通常の文字列とは異なる特殊な文字を表示するためには、エスケープシーケンスを利用します。
Code | Output |
---|---|
\0 |
NUL (空文字) |
\' |
シングルクォート |
\" |
ダブルクォート |
\\ |
バックスラッシュ |
\n |
改行 |
\r |
carriage return |
\v |
垂直タブ |
\t |
水平タブ |
\b |
バックスペース |
\f |
フォームフィード |
\uXXXX |
unicode コードポイント |
\u{X} ... \u{XXXXXX} |
unicode コードポイント |
\xXX |
Latin-1 文字 |
NOTE: 他の言語とは異なり、JavaScript はシングルクォートに囲まれた文字列とダブルクォートに囲まれた文字列に違いはありません。したがって、エスケープシーケンスはシングルクォート内でもダブルクォート内でも差異なく実行されます。
長い文字列リテラル
時々、コードに非常に長い文字列が含まれる場合があります。その時、延々と続く行が含まれたり、エディタの気まぐれによってラップされるよりも、実際の文字列コンテンツに影響を与えずに文字列をソースコード内で複数行に分割したいことがあります。これを行うには2つの方法があります。
複数の文字列を一緒にするために、+演算子をこのように使えます。
let longString = "This is a very long string which needs " +
"to wrap across multiple lines because " +
"otherwise my code is unreadable.";
または、文字列が次の行に続くことを示すために、各行の最後でバックスラッシュ文字("\") を使用できます。バックスラッシュの後には、(改行を除いて)スペースや何らかの文字、インデントなどがないか確認してください。さもないと、これは動作しません。このフォームは以下のようになります。
let longString = "This is a very long string which needs \
to wrap across multiple lines because \
otherwise my code is unreadable.";
これらの結果はともに同じ文字列が生成されます。
説明
文字列はテキスト形式で表現可能なデータを保持するのに便利です。最もよく使われる操作として、文字数をチェックする length
プロパティ、 +
演算子や +=
演算子を用いた文字列の連結、文字列の中の部分文字列の位置をチェックする substring
/ substr
メソッドが挙げられます。
文字へのアクセス
文字列内の個々の文字へのアクセス方法には、二通りの方法があります。そのひとつは charAt
メソッドです。
return 'ねこ'.charAt(1); // "こ" が返される
そしてもうひとつは、配列のようなオブジェクトとして文字列を扱い、数値のインデックスを用いる方法です。
return 'ねこ'[1]; // "こ" が返される。
ブラケット記法を使用した文字列アクセスでは、これらのプロパティに値を設定したり削除したりすることはできません。関連したプロパティは書き込みも設定もできません。(より詳細はObject.defineProperty
を見てください。)
文字列の比較
C 言語では 文字列の比較の為に strcmp()
関数を用います。 JavaScript では単純に 小なり / 大なり演算子を用います。
var a = "a"; var b = "b"; if (a < b) // true print(a + " is less than " + b); else if (a > b) print(a + " is greater than " + b); else print(a + " and " + b + " are equal.");
String
インスタンスから継承される localeCompare
メソッドを使用して同等の結果を得る事もできます。
プリミティブ値とオブジェクトの区別
JavaScript では、プリミティブ値の文字列とString
オブジェクトの文字列が区別されます。 (真偽値 と 数値 も同様にプリミティブ値とオブジェクトで区別されます。)
文字列リテラル (ダブルクォーテーションかシングルクォーテーションで示されます)、および String
関数を通常通り呼び出した場合 (すなわち new
演算子 を使わずに呼び出した場合) に返される値は、プリミティブ値の文字列です。
JavaScript では、必要に応じてプリミティブ値の文字列が自動的に String
オブジェクトに変換されます。そのため、プリミティブ値の文字列に対してメソッド呼び出しを行うことで、String
オブジェクトのメソッドを使用することができます。
プリミティブ値の文字列に対して、メソッドが呼び出されようとしている場合、またはプロパティの参照が行われようとしている場合、JavaScript は自動的にプリミティブ値の文字列をオブジェクトでラップします。その上で、該当するオブジェクトに対してメソッド呼び出しやプロパティの参照を行っています。
var s_prim = "foo"; var s_obj = new String(s_prim); console.log(typeof s_prim); // Logs "string" console.log(typeof s_obj); // Logs "object"
プリミティブ値の文字列と String
オブジェクトは eval
を利用しても異なる結果となります。 eval を実行した場合、プリミティブ値の文字列はソースコードとして扱われます。一方で、String オブジェクトは他のオブジェクトと同様にオブジェクトとしてそのままの文字列を返します。
s1 = "2 + 2"; // creates a string primitive 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 オブジェクトでうまく動作しないことがあります。しかし、一般的にはこれらの違いを考慮しなければならないことはあまりありません。
なお、String オブジェクトは valueOf
メソッドを利用することでプリミティブ値の文字列に変換することができます。
console.log(eval(s2.valueOf())); // returns the number 4
プロパティ
String
インスタンスから継承されているPropertiesについては、String インスタンスのPropertiesを参照してください。prototype
- Stringオブジェクトにプロパティの追加を許可します。
メソッド
String
インスタンスから継承されているMethodsについては、String インスタンスのMethodsを参照してください。fromCharCode
- Unicode値の指定されたシーケンスを使用して生成した文字列を返します。
Stringジェネリック
(ECMAScript標準に含まれていませんが)FirefoxのJavaScript1.6では、Stringインスタンスメソッドを、任意のオブジェクトにStringメソッドを適用するためにStringオブジェクトで使用できます。
var num = 15; alert(String.replace(num, /5/, '2'));
以下は、非サポートブラウザへサポートを提供するシムです。
/*globals define*/ // Assumes all supplied String instance methods already present (one may use shims for these if not available) (function () { 'use strict'; var i, // We could also build the array of methods with the following, but the // getOwnPropertyNames() method is non-shimable: // Object.getOwnPropertyNames(String).filter(function (methodName) {return typeof String[methodName] === 'function'}); methods = [ 'quote', 'substring', 'toLowerCase', 'toUpperCase', 'charAt', 'charCodeAt', 'indexOf', 'lastIndexOf', 'startsWith', 'endsWith', 'trim', 'trimLeft', 'trimRight', 'toLocaleLowerCase', 'toLocaleUpperCase', 'localeCompare', 'match', 'search', 'replace', 'split', 'substr', 'concat', 'slice', 'fromCharCode' ], methodCount = methods.length, assignStringGeneric = function (methodName) { var method = String.prototype[methodName]; String[methodName] = function (arg1) { return method.apply(arg1, Array.prototype.slice.call(arguments, 1)); }; }; for (i = 0; i < methodCount; i++) { assignStringGeneric(methods[i]); } }());
String
インスタンス
プロパティ
- constructor
- オブジェクトのプロトタイプを生成する関数を指定します。
- length
- 文字列の長さを返します。
- N
- N 番目の文字にアクセスするために用いられます。N は、0 から length - 1 までの正の整数です。このプロパティは読み込み専用です。
メソッド
HTML に関連しないメソッド
charAt
- 指定された添え字の文字を返します。
charCodeAt
- 与えられた添え字の文字の Unicode の値を示す数を返します。
concat
- 2 つの文字列を連結し、新しい文字列を返します。
contains
- 文字列中に指定された文字列が含まれているかを返します。
endsWith
- 文字列の終端に指定された文字列が含まれているかを返します。
indexOf
- 呼び出す
String
オブジェクト 中で、指定された値が最初に現れる添え字を返します。指定された値が見つからない場合は、-1 を返します。 lastIndexOf
- 呼び出す
String
オブジェクト 中で、指定された値が最後に現れる添え字を返します。指定された値が見つからない場合は、-1 を返します。 localeCompare
- 参照文字列が、並べ替え順において、与えられた文字列の前後にあるか、あるいは、同じかどうかを示します。
match
- 文字列に対する正規表現のマッチのために使用されます。
quote
- 文字列をダブルクォート ("
"
")で囲みます。 replace
- 正規表現と文字列の間のマッチを見つけ、マッチした部分文字列を新しい部分文字列に置き換えるために使用されます。
search
- 正規表現と指定された文字列の間のマッチのための検索を実行します。
slice
- 文字列の一部分を取り出し、新しい文字列を返します。
split
- 文字列を複数の部分文字列に区切ることによって、String オブジェクトを文字列の配列に分割します。
startsWith
- 文字列が指定された文字列で開始されているかを返します。
substr
- 文字列において、指定された位置から指定された文字数の文字を返します。
substring
- 文字列において、文字列内の 2 つの添え字の間にある文字を返します。
toLocaleLowerCase
- 文字列内の文字を現在のロケールでの小文字に変換します。ほとんどの言語で、このメソッドは、
toLowerCase
と同じ結果を返します。 toLocaleUpperCase
- 文字列内の文字を現在のロケールでの大文字に変換します。ほとんどの言語で、このメソッドは、
toUpperCase
と同じ結果を返します。 toLowerCase
- 小文字に変換された文字列の値を呼び出して返します。
toSource
- 指定されたオブジェクトを表すオブジェクトリテラルを返します。この値を新しいオブジェクトを生成するために使用することができます。
Object.toSource
メソッドを上書きします。 toString
- 指定されたオブジェクトの文字列を返します。Object.toString メソッドを上書きします。
toUpperCase
- 大文字に変換された文字列の値を呼び出して返します。
trim
- 文字列の最初と最後にある空白を削除します。ECMAScript 5 標準の一部です。
trimLeft
- 文字列の左側にある空白を削除します。
trimRight
- 文字列の右側にある空白を削除します。
valueOf
- 指定されたオブジェクトのプリミティブ値を返します。
Object.valueOf
メソッドを上書きします。
HTML ラッパーメソッド
以下のメソッドは、それぞれ、特定の HTML タグでラップされた文字列のコピーを返します。
anchor
<a name="name">
(ハイパーテキストターゲット)big
<big>
blink
<blink>
bold
<b>
fixed
<tt>
fontcolor
<font color="color">
fontsize
<font size="size">
italics
<i>
link
<a href="url">
(URL へのリンク)small
<small>
strike
<strike>
sub
<sub>
sup
<sup>
これらのメソッドは、使用に制限があるメソッドで、利用可能なHTML タグと属性のサブセットのみを提供します。
例
基底となるtoStringをいまだに呼び出していますが、この例ではtoString
の代替えとしてより安全に文字列を扱うことができます。そのため、nullとundefinedでも動作します。例えば:
var outputStrings = []; for (let i = 0, n = inputValues.length; i < n; ++i) { outputStrings.push(String(inputValues[i])); }
ブラウザ実装状況
機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
基本サポート | 0.2 | (有) | 9.0 | (有) | (有) |
機能 | Android | Firefox Mobile (Gecko) | IE Phone | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
基本サポート | (有) | (有) | (有) | (有) | (有) |