JavaScriptのStringとtoStringの違いは?

JavaScriptにおけるString()とtoString()の違いを徹底解説

JavaScriptでは、データ型を柔軟に変換できることが大きな特徴の一つですが、型の扱い方を間違えると予期せぬエラーを引き起こす可能性もあります。 特に、数値や真偽値などを文字列として扱う場合、String()toString() のどちらを使うべきか迷う場面があるのではないでしょうか?

本記事では、String()toString() の違いを、具体的なコード例を交えながら分かりやすく解説します。それぞれの動作原理、使用例、メリット・デメリットを理解することで、状況に応じて適切な方法を選択し、より安全で効率的なJavaScriptコードを書けるようになりましょう。

1. String():あらゆる値を文字列オブジェクトに変換するコンストラクタ

String() は、JavaScriptにおけるプリミティブ型の一つである文字列オブジェクトを生成するためのコンストラクタです。コンストラクタとは、オブジェクトを生成するための設計図のようなものです。

1.1 動作

  • 引数として与えられた値を元に、全く新しい文字列オブジェクトを生成します。
  • 引数を省略した場合、空の文字列オブジェクト ("") が生成されます。

1.2 使用例:数値、真偽値、null、undefined を文字列オブジェクトに変換


// 数値から文字列オブジェクトを生成
const num = 123;
const str1 = new String(num); 

// 真偽値から文字列オブジェクトを生成
const bool = true;
const str2 = new String(bool);

// nullから文字列オブジェクトを生成
const str3 = new String(null); 

// undefinedから文字列オブジェクトを生成
const str4 = new String(undefined);

console.log(str1); // "123" (文字列オブジェクト)
console.log(str2); // "true" (文字列オブジェクト)
console.log(str3); // "null" (文字列オブジェクト)
console.log(str4); // "undefined" (文字列オブジェクト)

上記の例では、new キーワードを使って String() コンストラクタを呼び出し、様々なデータ型の値を元に新しい文字列オブジェクトを生成しています。重要なのは、元のデータ型に関わらず、String() を通すと必ず新しい文字列オブジェクトが生成されるということです。

2. toString(): オブジェクトの値を文字列表現に変換するメソッド

toString() は、オブジェクトの値を文字列として表現するためのメソッドです。メソッドとは、オブジェクトに紐づいた処理のことです。JavaScriptでは、ほとんどのオブジェクトがtoString() メソッドを継承しており、オブジェクトの値に応じた文字列を返します。

2.1 動作

  • 呼び出したオブジェクトの値を、人間が理解しやすい形での文字列に変換します。ただし、変換結果はオブジェクトの型によって異なります。
  • プリミティブ型 (数値、文字列、真偽値など) にも toString() メソッドが暗黙的に適用されます。例えば、123..toString() のように、数値から直接呼び出すことも可能です。

2.2 使用例:数値、真偽値、配列を文字列に変換


// 数値の文字列表現を取得
const num = 123;
const str1 = num.toString();

// 真偽値の文字列表現を取得
const bool = true;
const str2 = bool.toString();

// 配列の文字列表現を取得
const arr = [1, 2, 3];
const str3 = arr.toString(); 

console.log(str1); // "123"
console.log(str2); // "true"
console.log(str3); // "1,2,3"

toString() メソッドは、オブジェクトの種類によって異なる振る舞いをします。例えば、配列に対して toString() を使うと、要素がカンマ区切りで連結された文字列が返されます。これは、配列の内容を人間が読みやすい形で表現するための工夫です。

3. String() と toString() の違い: 表で比較

ここまで見てきた String()toString() の違いを、以下の表にまとめました。

特徴 String() toString()
種類 コンストラクタ (オブジェクト生成) メソッド (オブジェクトに紐づいた処理)
動作 新しい文字列オブジェクトを生成する オブジェクトの文字列表現を返す
適用対象 全ての値 (数値、文字列、真偽値、null、undefined、オブジェクトなど) ほとんどのオブジェクト (ただし、nullundefined は除く)
戻り値 文字列オブジェクト 文字列

4. まとめ: 状況に応じて使い分けよう!

  • String() は、あらゆる値を元に新しい文字列オブジェクトを生成したい場合に最適です。特に、nullundefined を安全に文字列に変換する必要がある場合に便利です。
  • toString() は、既存のオブジェクトの値を文字列表現に変換したい場合に役立ちます。配列や日付など、JavaScriptが提供する様々なオブジェクトに対して適用できます。

どちらの方法も、JavaScriptで文字列を扱う上で重要な役割を果たします。変換元のデータ型、目的、状況に応じて適切な方法を選択することが重要です。

参考文献

Q&A

Q1: String() を使わずに文字列オブジェクトを生成することはできますか?

A1: はい、可能です。文字列リテラル (シングルクォートまたはダブルクォートで囲まれた文字列) を使用することで、String() コンストラクタを使わずに文字列オブジェクトを生成できます。例えば、const str = "Hello"; は、文字列リテラルを使って文字列オブジェクトを生成しています。

Q2: toString() を使用できないオブジェクトはありますか?

A2: nullundefinedtoString() メソッドを持っていません。これらの値に対して toString() を呼び出そうとすると、TypeError が発生します。このような場合は、String(null)String(undefined) のように、String() コンストラクタを使って変換する必要があります。

Q3: String()toString() のどちらを使うべきかの判断基準は?

A3: 新しい文字列オブジェクトを生成したい場合は String() を、既存のオブジェクトの文字列表現を取得したい場合は toString() を使用します。状況に応じて適切な方を選びましょう。

  • 新しい文字列オブジェクトが必要な場合: String() を使用します。例えば、ユーザー入力を受け取ってそれを元に新しい文字列を操作する場合などが該当します。
  • 既存のオブジェクトの文字列表現が欲しい場合: toString() を使用します。例えば、配列の内容を文字列としてログ出力する場合や、日付オブジェクトを特定のフォーマットで表示する場合などが該当します。

その他の参考記事:JavaScript String 文字列オブジェクト