BigInt コードレビュー・チェックリスト(テンプレート)
- 1. リテラルの末尾 n を忘れていないか?
- 2. Number と BigInt を混ぜて計算していないか?
- 3. 割り算 / の結果が切り捨てられることを理解しているか?
- 4. Math.* 関数を使っていないか?
- 5. JSON.stringify() にそのまま渡していないか?
- 6. 単項プラス(+value)を使っていないか?
- 7. ビット演算の対応範囲を理解しているか?
- 8. BigInt() に小数や非整数を渡していないか?
- 9. 精度損失のない変換が保証されているか?
- 10. 比較演算の挙動を理解しているか?
- 11. 安全に扱うための命名・ガイドライン
- まとめ:レビュー時の3秒チェック項目(簡易版)
1. リテラルの末尾 n を忘れていないか?
チェック項目
12345678901234567890のような数値リテラルにnが付いていない。
NG 例
const id = 12345678901234567890; // ← Number 型(精度落ちる!)
JavaScriptOK 例
const id = 12345678901234567890n; // ← BigInt 型
JavaScript理由
Numberは2^53 - 1以上で精度が失われる。- ID、トランザクション番号、暗号キーなどは必ず
nを付ける。
2. Number と BigInt を混ぜて計算していないか?
チェック項目
1n + 1のように混在していない?
NG 例
let total = 1n + 1; // ❌ TypeError: Cannot mix BigInt and other types
JavaScriptOK 例
let total = 1n + BigInt(1); // ✅
let total2 = Number(1n) + 1; // ✅
JavaScript理由
- 自動型変換はされない。
- 必ずどちらかに統一する。
レビュー補助ヒント
- ESLint ルール
no-mixed-bigint
3. 割り算 / の結果が切り捨てられることを理解しているか?
NG 例
console.log(5n / 2n); // → 2n(小数点以下切り捨て)
JavaScriptOK 例
// 小数が必要なら Number に変換
console.log(Number(5n) / 2); // → 2.5
JavaScript理由
- BigInt は「整数型」なので小数を保持できない。
- 割り算結果は ゼロ方向に丸められる。
4. Math.* 関数を使っていないか?
NG 例
Math.max(10n, 20n); // ❌ TypeError
JavaScriptOK 例
// BigInt 専用の比較で代用
10n > 20n ? 10n : 20n;
// または Number に変換して Math を使う
Math.max(Number(10n), Number(20n));
JavaScript理由
Mathライブラリは BigInt に非対応。- 数値を比較・丸める際は専用関数を作る。
5. JSON.stringify() にそのまま渡していないか?
NG 例
JSON.stringify({ id: 12345678901234567890n });
// ❌ TypeError: BigInt value can't be serialized in JSON
JavaScriptOK 例
JSON.stringify({ id: "12345678901234567890" }); // ✅ 文字列化して送る
JavaScript理由
- JSON は BigInt 型を理解できない。
- 保存・通信の際は文字列化 or 数値に変換。
6. 単項プラス(+value)を使っていないか?
NG 例
const big = +10n; // ❌ TypeError: Cannot convert a BigInt value to a number
JavaScriptOK 例
const big = BigInt(10); // ✅
JavaScript理由
- 単項プラスは Number 変換を伴うため、BigInt では禁止。
7. ビット演算の対応範囲を理解しているか?
チェック項目
>>>(符号なし右シフト)は BigInt では使えない。- 他(
& | ^ ~ << >>)は OK。
NG 例
10n >>> 2n; // ❌ SyntaxError
JavaScriptOK 例
10n >> 2n; // ✅ 右シフト(符号あり)
JavaScript8. BigInt() に小数や非整数を渡していないか?
NG 例
BigInt(3.14); // ❌ RangeError: The number 3.14 cannot be converted to a BigInt
JavaScriptOK 例
BigInt(3); // ✅
JavaScript9. 精度損失のない変換が保証されているか?
チェック項目
BigInt → Number変換時、値が安全範囲内にあるか。
OK 例
const small = 12345n;
console.log(Number(small)); // ✅ 安全範囲内
JavaScriptNG 例
const huge = 999999999999999999999999n;
console.log(Number(huge)); // ⚠ 精度喪失(末尾の桁が消える)
JavaScript10. 比較演算の挙動を理解しているか?
注意
==は型変換あり、===は型も比較。
例
0n == 0 // → true (値だけ比較)
0n === 0 // → false (型が違う)
JavaScript11. 安全に扱うための命名・ガイドライン
推奨ルール
- 変数名に
_nや_bigを付けて BigInt であることを明示 - BigInt を扱う関数にはコメントで注意点を明記
例
// ✅ 明示的な命名
const orderId_n = 12345678901234567890n;
// ✅ ドキュメント例
/**
* BigInt での金額合計を計算(小数は扱えない)
*/
function calcTotalBigInt(items) { ... }
JavaScriptまとめ:レビュー時の3秒チェック項目(簡易版)
| チェック項目 | Yes/No |
|---|---|
1. n 付きリテラルを忘れていない? | ☐ |
2. Number と混ぜてない? | ☐ |
| 3. 割り算は意図した切り捨て? | ☐ |
4. Math や JSON.stringify でエラーにならない? | ☐ |
| 5. 変換で精度落ちてない? | ☐ |

