Skip to content

Commit 5b31466

Browse files
azulacolaco
andauthored
feat(data-type): BigIntのセクションを追加 (#1184)
* feat(data-type): BigIntのセクションを追加 * fix(data-type): プリミティブ型の種類は7つに増えた * fix(data-type): ES2020を追加 * fix typo * fix * fix * fix * fix * Update source/basic/data-type/README.md Co-authored-by: Suguru Inatomi <[email protected]> * Update source/basic/data-type/README.md Co-authored-by: Suguru Inatomi <[email protected]> Co-authored-by: Suguru Inatomi <[email protected]>
1 parent b91ce7f commit 5b31466

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed

.textlintrc.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ module.exports = {
6565
"max-kanji-continuous-len": {
6666
"max": 6,
6767
"allow": [
68+
"倍精度浮動小数",
6869
"浮動小数点数",
6970
"排他的論理和",
7071
"文字列演算子",

source/basic/data-type/README.md

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,12 @@ JavaScriptでは、文字列も一度作成したら変更できないイミュ
2222
オブジェクトは、一度作成した後もその値自体を変更できるためミュータブル(mutable)の特性を持ちます。
2323
オブジェクトは、値そのものではなく値への参照を経由して操作されるため、参照型のデータとも言います。
2424

25-
データ型を細かく見ていくと、6つのプリミティブ型とオブジェクトからなります
25+
データ型を細かく見ていくと、7つのプリミティブ型とオブジェクトからなります
2626

2727
- プリミティブ型(基本型)
2828
- 真偽値(Boolean): `true`または`false`のデータ型
2929
- 数値(Number): `42``3.14159` などの数値のデータ型
30+
- 巨大な整数(BigInt): ES2020から追加された`9007199254740992n`などの任意精度の整数のデータ型
3031
- 文字列(String): `"JavaScript"` などの文字列のデータ型
3132
- undefined: 値が未定義であることを意味するデータ型
3233
- null: 値が存在しないことを意味するデータ型
@@ -43,6 +44,7 @@ JavaScriptでは、文字列も一度作成したら変更できないイミュ
4344
```js
4445
console.log(typeof true);// => "boolean"
4546
console.log(typeof 42); // => "number"
47+
console.log(typeof 9007199254740992n); // => "bigint"
4648
console.log(typeof "JavaScript"); // => "string"
4749
console.log(typeof Symbol("シンボル"));// => "symbol"
4850
console.log(typeof undefined); // => "undefined"
@@ -107,7 +109,12 @@ false; // => false
107109

108110
### 数値(Number){#number}
109111

110-
数値は大きく分けて`42`のような整数リテラルと`3.14159`のような浮動小数点数リテラルがあります。
112+
数値には`42`のような整数リテラルと`3.14159`のような浮動小数点数リテラルがあります。
113+
114+
これらのリテラルで表現できる数値は[IEEE 754][]の倍精度浮動小数として扱われます。
115+
倍精度浮動小数では64bitで数値を表現します。
116+
64bitのうち52bitを数字の格納のために使い、11bitを小数点の位置に使い、残りの1bitはプラスとマイナスの符号です。
117+
そのため、正確に扱える数値の最大値は`2^53-1`(2の53乗から1引いた値)となります。
111118

112119
#### 整数リテラル {#integer-literal}
113120

@@ -189,7 +196,6 @@ console.log(0x30A2); // => 12450
189196

190197
#### 浮動小数点数リテラル {#floating-point-number-literal}
191198

192-
JavaScriptの浮動小数点数は[IEEE 754][]を採用しています。
193199
浮動小数点数をリテラルとして書く場合には、次の2種類の表記が利用できます。
194200

195201
- `3.14159` のような `.`(ドット)を含んだ数値
@@ -215,6 +221,40 @@ JavaScriptの浮動小数点数は[IEEE 754][]を採用しています。
215221
2e8; // => 200000000
216222
```
217223

224+
### [ES2020] BigInt {#Bigint-literal}
225+
226+
`1``3.14159`などの数値リテラルは[IEEE 754][]の倍精度浮動小数であるため、正確に扱える数値の最大値は`2^53-1`(2×10の53乗から1引いた値)です。
227+
この数値リテラルで安全に表せる最大の数値は`Number.MAX_SAFE_INTEGER`として定義されています。
228+
229+
```js
230+
console.log(Number.MAX_SAFE_INTEGER); // => 9007199254740991
231+
```
232+
233+
数値リテラルで`2^53-1``9007199254740991`)よりも大きな値を表現したり計算すると間違った結果となる場合があります。
234+
235+
この問題を解決するために、ES2020では`BigInt`という新しい整数型のデータ型とリテラルが追加されました。
236+
数値リテラルは倍精度浮動小数(64bit)で数値を扱うのに対して、BigIntでは任意の精度の整数を扱えます。
237+
そのため、BigIntでは`2^53-1``9007199254740991`)よりも大きな整数を正しく表現できます。
238+
239+
BigIntリテラルは、数値の後ろに`n`をつけます。
240+
241+
{{book.console}}
242+
```
243+
console.log(1n); // => 1n
244+
// 2^53-1より大きな値も扱える
245+
console.log(9007199254740992n); // => 9007199254740992n
246+
```
247+
248+
BigIntは整数を扱うデータ型であるため、次のように小数点を含めた場合は構文エラーとなります。
249+
250+
<!-- textlint-disable -->
251+
<!-- doctest:SyntaxError -->
252+
```js
253+
1.2n; // => SyntaxError
254+
```
255+
256+
<!-- textlint-enable -->
257+
218258
### 文字列(String){#string}
219259

220260
文字列リテラル共通のルールとして、同じ記号で囲んだ内容を文字列として扱います。

0 commit comments

Comments
 (0)