ラッパー関連バグ検出チェックリスト(レビュー用テンプレート)
セクション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 / BigInt に new を使用 | new Symbol() / new BigInt() → TypeError | 実行時エラー | Symbol("x") / BigInt(123) を使う |
セクション6:レビュー時の確認フロー(実務テンプレート)
1 値定義の確認
new Number,new String,new Booleanの使用がないかObject(プリミティブ)の利用がないか
2 型チェックの確認
typeofとinstanceofの使い分けが正しいか==を使っていないか(===に統一)
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ルールで自動検出を設定 | ヒューマンエラー防止 |

