→
文字の並びを表したり操作したりするために使用されます。
文字列は、テキスト形式で表現可能なデータを保持するのに便利です。最もよく使われる操作として、文字列の長さをチェックする length プロパティ、文字列に対する + および += 演算子を用いた文字列の連結、文字列の中の部分文字列の存在や位置をチェックする indexOf() メソッド、部分文字列を取り出す substring() メソッドが挙げられます。
コンストラクターではなく関数として呼び出されたときは型変換を行うので、普通はより有用です。
テンプレート文字列を処理して返します。
指定文字数が String の文字数よりも小さくても、元の文字列は確保されます。
指定文字数が String の文字数よりも小さくても、元の文字列は確保されます。
非推奨です。これらのメソッドは避けてください。
以下のメソッドは、それぞれ、特定の HTML タグでラップされた文字列のコピーを返します。
文字列は文字列リテラルからプリミティブとして、または 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 文字の変換に問題があるため、小文字の代わりに大文字を使用します。
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 を使用すると、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]:う