JavaScript 型バグ練習帳 — 応用編(全10問)
各問題には:
- ❓ コード例
- 💡 ヒント
- ✅ 正解と詳しい解説
第1問:暗黙の文字列化
console.log([1, 2] + [3, 4]);
JavaScript💡 ヒント:+ は数値だけでなく文字列連結にも使われます。
✅ 答え:
"1,23,4"
📘 解説:
配列は toString() により "1,2" → "3,4" と文字列化され、連結されます。
数値演算したい場合は [1,2].concat([3,4]) や reduce() を使いましょう。
第2問:parseInt の第2引数を忘れる
console.log(parseInt("08"));
JavaScript💡 ヒント:
古い仕様では、先頭ゼロが「8進数」とみなされることがありました。
✅ 答え:
8
📘 解説:
ES5以降では自動8進数解釈は廃止されましたが、
安全のために常に基数(radix)を指定するのがベスト:
parseInt("08", 10);JavaScript第3問:数値と文字列の比較
console.log(5 < "10");
JavaScript💡 ヒント:
比較演算子は、型変換を行うときがあります。
✅ 答え:
true
📘 解説:"10" は数値に変換され 5 < 10 と評価されます。
ただし "2" < "10" は false(文字列比較)になるため要注意。
第4問:typeof NaN
console.log(typeof NaN);
JavaScript💡 ヒント:
NaN は “Not a Number” なのに…?
✅ 答え:
"number"
📘 解説:
NaN は数値型の一種(Number型の特殊値)です。Number.isNaN() で安全に判定できます。
第5問:配列の穴
const arr = [1, , 3];
console.log(arr.length, arr[1]);
JavaScript💡 ヒント:
「スパース配列」と呼ばれる構造です。
✅ 答え:
3 undefined
📘 解説:
空要素は存在しないインデックス扱い(undefinedとは別)。forEach などはスキップするので、
配列を操作するときは map や Array.from を使うと安全。
第6問:== と === の入れ子
console.log(null == undefined);
console.log(null === undefined);
JavaScript✅ 答え:
true
false
📘 解説:== は null と undefined を「同値」と扱う特例があります。
厳密に区別するには === を使いましょう。
第7問:isNaN の落とし穴
console.log(isNaN("hello"));
JavaScript💡 ヒント:
isNaN は暗黙に数値変換を行います。
✅ 答え:
true
📘 解説:"hello" → NaN になるため true。
型安全に判定したい場合は Number.isNaN() を使うべきです。
第8問:BigIntとMath
console.log(Math.max(10n, 20n));
JavaScript✅ 答え:
TypeError
📘 解説:Math 関数は BigInt に対応していません。
BigInt同士の比較は 10n > 20n のように行う必要があります。
第9問:JSON.stringify 循環参照
const obj = {};
obj.self = obj;
JSON.stringify(obj);
JavaScript💡 ヒント:
JSON.stringifyは「ツリー構造」でないと処理できません。
✅ 答え:
TypeError: Converting circular structure to JSON
📘 解説:
オブジェクトが自分自身を参照しているため循環構造。
安全に文字列化するには structuredClone() や flatted ライブラリを使用します。
第10問:Symbolの比較
console.log(Symbol("x") === Symbol("x"));
JavaScript💡 ヒント:
同じ説明文字列でも別のシンボル?
✅ 答え:
false
📘 解説:Symbol() は一意な識別子を作成します。
共有したい場合は Symbol.for("x") を使います(グローバルレジストリ登録)。
まとめ表
| 問題 | 型バグテーマ | 注意点 |
|---|---|---|
| 1 | 暗黙の文字列化 | +演算子の型変換 |
| 2 | parseInt基数 | 常に第2引数を指定 |
| 3 | 比較の型変換 | "2" < "10"に注意 |
| 4 | NaNの型 | typeofは”number” |
| 5 | スパース配列 | undefinedと異なる |
| 6 | null vs undefined | ==の特例 |
| 7 | isNaNの誤用 | Number.isNaNを使用 |
| 8 | BigIntとMath | 非対応、比較演算使用 |
| 9 | JSON循環構造 | stringifyできない |
| 10 | Symbolの同一性 | Symbol.forで共有 |
