基本のおさらい:Stringオブジェクトとは?
文字列には2種類あります:
| 種類 | 型 | 例 | 備考 |
|---|---|---|---|
| プリミティブ文字列 | "string"(基本型) | "abc" | 最もよく使う。軽量。 |
| Stringオブジェクト | new String("abc") | String {"abc"} | オブジェクト型。特殊な用途以外ではあまり使わない。 |
JavaScript は内部的に、
プリミティブ文字列にメソッドを使ったとき(例:"abc".length)
自動的に一時的な String オブジェクトを生成してメソッドを呼び出します。
よくある落とし穴:型の違いによる比較の挙動
例1:見た目が同じでも型が違う
let s1 = "abc"; // プリミティブ文字列
let s2 = new String("abc"); // Stringオブジェクト
console.log(typeof s1); // "string"
console.log(typeof s2); // "object"
JavaScript🔍 見た目は同じ「abc」でも、型が違う!
例2:比較(== と === の違い)
console.log(s1 == s2); // true
console.log(s1 === s2); // false
JavaScript==は型変換を行うため、「内容が同じなら true」になります。===は型も比較するため、「string」と「object」は違うと判断されます。
👉 結論:比較は常に === を使うのが安全。
(特に、Stringオブジェクトとプリミティブを混ぜるとバグの温床になります)
例3:同じオブジェクトでも参照は別物
let a = new String("abc");
let b = new String("abc");
console.log(a == b); // false
console.log(a === b); // false
JavaScript同じ内容でも、new を使うたびに別のオブジェクトが作られるため、どちらも false。
🧠 これが「Stringオブジェクトを使うべきではない」と言われる理由のひとつです。
valueOf() と toString() の実用的使い分け
| メソッド | 返す値 | 用途 |
|---|---|---|
valueOf() | プリミティブな文字列 | 計算・比較など内部処理向け |
toString() | 文字列の表現 | 表示・出力など人間向け |
let city = new String("札幌");
console.log(city.valueOf()); // "札幌"
console.log(city.toString()); // "札幌"
JavaScript両方ほぼ同じに見えますが、valueOf() は「純粋な値」、toString() は「文字列表現」を返すという違いがあります。
実践的アドバイス
原則:new String() は使わない
- 文字列リテラル
"..."を使うだけで十分。 typeofやinstanceofの判定が混乱しやすくなる。
もしオブジェクトとして扱いたい場合(特殊ケース)
たとえば「文字列に追加のプロパティを持たせたい」とき:
let str = new String("Hello");
str.lang = "ja";
console.log(str.lang); // "ja"
JavaScript→ こういうときは確かにオブジェクトが必要ですが、
普通は別のオブジェクトで管理すべき(例:{ text: "Hello", lang: "ja" })。
比較で混乱しないためのチェックポイント
| 状況 | 比較結果 | 安全な対処法 |
|---|---|---|
"abc" === new String("abc") | ❌ false | valueOf()で比較する |
"abc" == new String("abc") | ⚠️ true(型変換あり) | 避ける |
new String("abc") === new String("abc") | ❌ false | 同じオブジェクトを使う |
まとめ
| 項目 | 内容 |
|---|---|
| Stringオブジェクトの目的 | プリミティブ文字列にメソッドを提供するラッパー |
| 基本操作 | valueOf(), toString() で中身の文字列を取得 |
| 型の違い | "abc" は string、new String("abc") は object |
| 比較の注意点 | === で比較し、プリミティブ同士で扱う |
| 実用上の結論 | 文字列はリテラルで十分。new String() は避けよう。 |

