JavaScript | ラッパーオブジェクトとプリミティブ型

javascrpit JavaScript
スポンサーリンク

ラッパー関連バグ検出チェックリスト(レビュー用テンプレート)


セクション1:ラッパーオブジェクト使用チェック

チェック項目対象コード例想定リスク対応策
new Number() を使っているconst n = new Number(5);typeof"object" になり、比較や真偽判定で誤作動const n = Number(5); または const n = 5;
new String() を使っているconst s = new String("abc");空文字チェックが壊れる(truthyになる)const s = "abc";
new Boolean() を使っているconst b = new Boolean(false);条件式で常に true 判定されるconst b = false; または Boolean(false)
⚠️ Object(プリミティブ) を使っているObject("x") / Object(3)暗黙ラッパー生成で型チェック不一致ラッパーを明示的に使わない

セクション2:型判定ロジックの安全性チェック

チェック項目判定例リスク対応策
typeof 結果が "object" で混乱しているtypeof new Number(3)"object"誤判定により型ガードが機能しないtypeof x === "number" を期待する場合、new を使わない
⚠️ instanceof String / Number でプリミティブを判定している"abc" instanceof String → false常に false になるtypeof x === "string" を使用
⚠️ 比較に == を使用しているnew Number(5) == 5 → true暗黙の型変換により誤判定=== を使う(型変換なし)

セクション3:真偽値評価の安全性チェック

チェック項目問題例リスク対応策
❌ 条件式に new Boolean(false) を使用if (new Boolean(false)) → true意図と逆の動作プリミティブ boolean を使用
⚠️ new Number(0) / new String("") を条件式に使用truthy になってしまうfalsy 判定が壊れるプリミティブ値に戻す
⚠️ !! 二重否定でオブジェクトを boolean にしていないif (obj) でなく !!obj 明示化を検討評価が曖昧になるBoolean(x) または !!x を明示的に使う

セクション4:データ構造・JSON変換時の挙動チェック

チェック項目問題例リスク対応策
JSON.stringify の結果が {} になっている{ count: new Number(5) }{"count":{}}ラッパーオブジェクトはシリアライズされないプリミティブを使う (count: 5)
⚠️ データモデルに new String() などを使っているラッパー混入でデータ整合性が崩れる型不一致で検証処理が失敗型変換してプリミティブに統一

セクション5:構文・演算・プロパティ挙動チェック

チェック項目問題例リスク対応策
❌ 数値リテラルで .toFixed() を直接呼んでいる1.toFixed(2) → SyntaxErrorパースエラー(1).toFixed(2) または 1..toFixed(2)
⚠️ プリミティブにプロパティ追加している"abc".custom = 1追加後すぐ破棄される(意味なし)オブジェクトを使うか別変数に保持
⚠️ Symbol / BigIntnew を使用new Symbol() / new BigInt() → TypeError実行時エラーSymbol("x") / BigInt(123) を使う

セクション6:レビュー時の確認フロー(実務テンプレート)

1 値定義の確認

  • new Number, new String, new Boolean の使用がないか
  • Object(プリミティブ) の利用がないか

2 型チェックの確認

  • typeofinstanceof の使い分けが正しいか
  • == を使っていないか(=== に統一)

3 真偽評価の確認

  • falsy 値(0, "", false)が意図通り動作しているか
  • ラッパー型が truthy 扱いされていないか

4 シリアライズ/データ出力の確認

  • JSON.stringify 結果に {} が混ざっていないか
  • API送信時に new Number() などが混入していないか

5 構文・挙動の確認

  • 数値リテラルの .toString() / .toFixed() が構文エラーになっていないか
  • プリミティブに不要なプロパティを追加していないか

おまけ:自動検出ヒント(ESLintルール設定例)

ESLintで防ぐなら、以下のルールを有効にするとほぼ自動検出できます:

{
  "rules": {
    "no-new-wrappers": "error",         // new Number/String/Boolean を禁止
    "eqeqeq": ["error", "always"],      // == の禁止
    "no-implicit-coercion": "warn",     // 暗黙の型変換警告
    "no-extra-boolean-cast": "off",     // !! を許可
    "no-undef": "error"
  }
}
JSON

まとめ

原則推奨行動
🚫 new Number/String/Boolean は使わない代わりにプリミティブまたは変換関数を使う
typeof / === で厳密チェック型変換を避けて安全比較
⚠️ JSON化・条件式・型判定をレビュー時に重点確認ラッパー混入で意図が崩れるリスクあり
🔧 Lintルールで自動検出を設定ヒューマンエラー防止
タイトルとURLをコピーしました