JavaScript | 長整数リテラルの記述方法

JavaScript JavaScript
スポンサーリンク

BigInt コードレビュー・チェックリスト(テンプレート)

1. リテラルの末尾 n を忘れていないか?

チェック項目

  • 12345678901234567890 のような数値リテラルに n が付いていない。

NG 例

const id = 12345678901234567890; // ← Number 型(精度落ちる!)
JavaScript

OK 例

const id = 12345678901234567890n; // ← BigInt 型
JavaScript

理由

  • Number2^53 - 1 以上で精度が失われる。
  • ID、トランザクション番号、暗号キーなどは必ず n を付ける。

2. Number と BigInt を混ぜて計算していないか?

チェック項目

  • 1n + 1 のように混在していない?

NG 例

let total = 1n + 1; // ❌ TypeError: Cannot mix BigInt and other types
JavaScript

OK 例

let total = 1n + BigInt(1);  // ✅
let total2 = Number(1n) + 1; // ✅
JavaScript

理由

  • 自動型変換はされない。
  • 必ずどちらかに統一する。

レビュー補助ヒント

3. 割り算 / の結果が切り捨てられることを理解しているか?

NG 例

console.log(5n / 2n); // → 2n(小数点以下切り捨て)
JavaScript

OK 例

// 小数が必要なら Number に変換
console.log(Number(5n) / 2); // → 2.5
JavaScript

理由

  • BigInt は「整数型」なので小数を保持できない。
  • 割り算結果は ゼロ方向に丸められる

4. Math.* 関数を使っていないか?

NG 例

Math.max(10n, 20n); // ❌ TypeError
JavaScript

OK 例

// 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
JavaScript

OK 例

JSON.stringify({ id: "12345678901234567890" }); // ✅ 文字列化して送る
JavaScript

理由

  • JSON は BigInt 型を理解できない。
  • 保存・通信の際は文字列化 or 数値に変換。

6. 単項プラス(+value)を使っていないか?

NG 例

const big = +10n; // ❌ TypeError: Cannot convert a BigInt value to a number
JavaScript

OK 例

const big = BigInt(10); // ✅
JavaScript

理由

  • 単項プラスは Number 変換を伴うため、BigInt では禁止。

7. ビット演算の対応範囲を理解しているか?

チェック項目

  • >>>(符号なし右シフト)は BigInt では使えない。
  • 他(& | ^ ~ << >>)は OK。

NG 例

10n >>> 2n; // ❌ SyntaxError
JavaScript

OK 例

10n >> 2n; // ✅ 右シフト(符号あり)
JavaScript

8. BigInt() に小数や非整数を渡していないか?

NG 例

BigInt(3.14); // ❌ RangeError: The number 3.14 cannot be converted to a BigInt
JavaScript

OK 例

BigInt(3); // ✅
JavaScript

9. 精度損失のない変換が保証されているか?

チェック項目

  • BigInt → Number 変換時、値が安全範囲内にあるか。

OK 例

const small = 12345n;
console.log(Number(small)); // ✅ 安全範囲内
JavaScript

NG 例

const huge = 999999999999999999999999n;
console.log(Number(huge)); // ⚠ 精度喪失(末尾の桁が消える)
JavaScript

10. 比較演算の挙動を理解しているか?

注意

  • == は型変換あり、=== は型も比較。

0n == 0   // → true  (値だけ比較)
0n === 0  // → false (型が違う)
JavaScript

11. 安全に扱うための命名・ガイドライン

推奨ルール

  • 変数名に _n_big を付けて BigInt であることを明示
  • BigInt を扱う関数にはコメントで注意点を明記

// ✅ 明示的な命名
const orderId_n = 12345678901234567890n;

// ✅ ドキュメント例
/**
 * BigInt での金額合計を計算(小数は扱えない)
 */
function calcTotalBigInt(items) { ... }
JavaScript

まとめ:レビュー時の3秒チェック項目(簡易版)

チェック項目Yes/No
1. n 付きリテラルを忘れていない?
2. Number と混ぜてない?
3. 割り算は意図した切り捨て?
4. MathJSON.stringify でエラーにならない?
5. 変換で精度落ちてない?
タイトルとURLをコピーしました