JavaScript | Stringオブジェクト

JavaScript JavaScript
スポンサーリンク

基本のおさらい: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() は使わない

  • 文字列リテラル "..." を使うだけで十分。
  • typeofinstanceof の判定が混乱しやすくなる。

もしオブジェクトとして扱いたい場合(特殊ケース)

たとえば「文字列に追加のプロパティを持たせたい」とき:

let str = new String("Hello");
str.lang = "ja";

console.log(str.lang); // "ja"
JavaScript

→ こういうときは確かにオブジェクトが必要ですが、
普通は別のオブジェクトで管理すべき(例:{ text: "Hello", lang: "ja" })。

比較で混乱しないためのチェックポイント

状況比較結果安全な対処法
"abc" === new String("abc")❌ falsevalueOf()で比較する
"abc" == new String("abc")⚠️ true(型変換あり)避ける
new String("abc") === new String("abc")❌ false同じオブジェクトを使う

まとめ

項目内容
Stringオブジェクトの目的プリミティブ文字列にメソッドを提供するラッパー
基本操作valueOf(), toString() で中身の文字列を取得
型の違い"abc" は string、new String("abc") は object
比較の注意点=== で比較し、プリミティブ同士で扱う
実用上の結論文字列はリテラルで十分。new String() は避けよう。
タイトルとURLをコピーしました