【入門編】 BigIntとNumber型の相互運用性の制限 – JavaScript実践ガイド

こんにちは!フロントエンドの現場で長年コードと向き合っていると、たまに「えっ、なんでここでエラーになるの!?」と頭を抱えたくなるような、JavaScriptのちょっと気難しい一面に出会うことがあります。

今日はその中でも、特に初学者の方が「あ、地雷踏んだ!」となりやすい「BigInt(ビッグイント)とNumber(ナンバー)の仲の悪さ」についてお話ししますね。

大丈夫です、全然難しいことじゃないんです。身近な例えでサクッと攻略しちゃいましょう。

—

1. まずは「数字の単位」が違うと想像してみて

JavaScriptの世界には、普段使いの「普通の数字(Number型)」と、とてつもなく大きな数字を扱うための「BigInt型」という2種類の数字が存在します。

イメージとしてはこんな感じです。

  • Number型(普通の数字): お財布に入っている小銭や、お買い物で使うような普通の数字。計算が早くて扱いやすいけど、桁が大きすぎると正確に数えられなくなる(限界がある)という弱点があります。
  • BigInt型(巨大な数字): 宇宙の星の数や、超巨大なデータベースのIDなど、桁がどれだけ増えても正確に扱える「重戦車」のような数字。ただし、普通の数字とは規格が違います。

ここでJavaScriptのルールとして大切なポイントがあります。
「普通の数字と、重戦車(BigInt)は、そのまま混ぜて計算してはいけません!」

JavaScriptは、型が違うもの同士を計算しようとすると、普段は気を利かせて「よし、こっちを合わせとくね!」と勝手に変換(暗黙の型変換)してくれることが多いんです。でも、このBigIntに関しては、「危ないから勝手に混ぜるな!」と厳格に禁止されているんです。

—

2. なぜ「混ぜてはいけない」のか?

例えば、こんなコードを書くとJavaScriptは怒り出します。

const 普通の数字 = 10;
const 巨大な数字 = 100n; // 最後に ‘n’ をつけるとBigIntになります

// これをやるとエラーが出ます!
// console.log(普通の数字 + 巨大な数字);
// Uncaught TypeError: Cannot mix BigInt and other types

なぜ怒るのか? それは、「巨大な数字を普通の数字に変換すると、桁が溢れて情報が壊れるかもしれないから」です。

JavaScriptは非常に慎重で、「君が意図して変換するならいいけど、僕の勝手な判断でデータを壊したくないんだ」と言っているようなもの。このエラーは、実はJavaScriptの「親切なブレーキ」なんですよ。

—

3. どうすれば仲良く計算できるの?(明示的な変換)

もし、どうしてもこの二つを一緒に計算したいなら、「どちらの型に合わせるか」を人間がはっきりと指定(キャスト)してあげる必要があります。

パターンA:全部「BigInt」として計算する

精度を落としたくないなら、普通の数字をBigIntに変換してあげましょう。

const 普通の数字 = 10;
const 巨大な数字 = 100n;

// 普通の数字を BigInt() で包んでから計算します
const 結果 = BigInt(普通の数字) + 巨大な数字;

console.log(結果); // 110n と表示されます

パターンB:全部「Number」として計算する

逆に、桁が大きすぎないことが分かっていて、普通の数字として扱いたい場合はこちら。

const 普通の数字 = 10;
const 巨大な数字 = 100n;

// BigIntを Number() で包んでから計算します
const 結果 = 普通の数字 + Number(巨大な数字);

console.log(結果); // 110 と表示されます

—

4. 現場からのアドバイス

「じゃあ、どっちを使えばいいの?」と迷うかもしれませんね。

現場での鉄則は、「基本はNumberを使い、本当に巨大な数字(IDなど)が必要なときだけBigIntを使う」というスタンスです。そして、もし混在した計算が必要になったら、迷わず`BigInt()`か`Number()`でラップする。

「暗黙の型変換」は便利に見えて、実はあとでバグの温床になりやすいんです。今回のようにJavaScriptが「自分でちゃんと指定してね!」と言ってくれるのは、実は「より安全なコードを書いてほしい」というサインなんですよ。

—

まとめ:怖がらなくて大丈夫!

  • NumberとBigIntは混ぜるな危険!
  • 混ぜたくなったら、`BigInt()` か `Number()` で明示的に変換しよう。
  • エラーが出たら「あ、JavaScriptが僕の計算を気遣ってブレーキを踏んでくれたんだな」と思えばOK!

最初は少し手間に感じるかもしれませんが、この「型を意識する癖」がつくと、あなたの書くコードは驚くほど堅牢で、プロフェッショナルなものに変わっていきます。

つまずいたときは、いつでもこの記事に戻ってきてくださいね。一緒に少しずつ、強くなっていきましょう!

コメント

タイトルとURLをコピーしました