Skip to content

Commit f86bff9

Browse files
committed
docs(number): add Integer type
1 parent 8c8be74 commit f86bff9

File tree

2 files changed

+86
-0
lines changed

2 files changed

+86
-0
lines changed

docs/number.md

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,3 +680,88 @@ Math.pow(99, 99)
680680

681681
上面代码中,两个运算结果的最后一位有效数字是有差异的。
682682

683+
## Integer 数据类型
684+
685+
### 简介
686+
687+
JavaScript 所有数字都保存成64位浮点数,这决定了整数的精确程度只能到53个二进制位。大于这个范围的整数,JavaScript 是无法精确表示的,这使得 JavaScript 不适合进行科学和金融方面的精确计算。
688+
689+
现在有一个[提案](https://github.com/tc39/proposal-bigint),引入了新的数据类型 Interger(整数),来解决这个问题。整数类型的数据只用来表示整数,没有位数的限制,任何位数的整数都可以精确表示。
690+
691+
为了与 Number 类型区别,Integer 类型的数据必须使用后缀`n`表示。
692+
693+
```javascript
694+
1n + 2n // 3n
695+
```
696+
697+
二进制、八进制、十六进制的表示法,都要加上后缀`n`
698+
699+
```javascript
700+
0b1101n // 二进制
701+
0o777n // 八进制
702+
0xFFn // 十六进制
703+
```
704+
705+
`typeof`运算符对于 Integer 类型的数据返回`integer`
706+
707+
```javascript
708+
typeof 123n
709+
// 'integer'
710+
```
711+
712+
JavaScript 原生提供`Integer`对象,用来生成 Integer 类型的数值。转换规则基本与`Number()`一致。
713+
714+
```javascript
715+
Integer(123) // 123n
716+
Integer('123') // 123n
717+
Integer(false) // 0n
718+
Integer(true) // 1n
719+
```
720+
721+
以下的用法会报错。
722+
723+
```javascript
724+
new Integer() // TypeError
725+
Integer(undefined) //TypeError
726+
Integer(null) // TypeError
727+
Integer('123n') // SyntaxError
728+
Integer('abc') // SyntaxError
729+
```
730+
731+
### 运算
732+
733+
在数学运算方面,Integer 类型的`+``-``*``**`这四个二元运算符,与 Number 类型的行为一致。除法运算`/`会舍去小数部分,返回一个整数。
734+
735+
```javascript
736+
9n / 5n
737+
// 1n
738+
```
739+
740+
几乎所有的 Number 运算符都可以用在 Integer,但是有两个除外:不带符号的右移位运算符`>>>`和一元的求正运算符`+`,使用时会报错。前者是因为`>>>`要求最高位补0,但是 Integer 类型没有最高位,导致这个运算符无意义。后者是因为一元运算符`+`在 asm.js 里面总是返回 Number 类型或者报错。
741+
742+
Interger 类型不能与 Number 类型进行混合运算。
743+
744+
```javascript
745+
1n + 1
746+
// 报错
747+
```
748+
749+
这是因为无论返回的是 Integer 或 Number,都会导致丢失信息。比如`(2n**53n + 1n) + 0.5`这个表达式,如果返回 Integer 类型,`0.5`这个小数部分会丢失;如果返回 Number 类型,会超过 53 位精确数字,精度下降。
750+
751+
相等运算符(`==`)会改变数据类型,也是不允许混合使用。
752+
753+
```javascript
754+
0n == 0
755+
// 报错 TypeError
756+
757+
0n == false
758+
// 报错 TypeError
759+
```
760+
761+
精确相等运算符(`===`)不会改变数据类型,因此可以混合使用。
762+
763+
```javascript
764+
0n === 0
765+
// false
766+
```
767+

docs/reference.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
## 数值
7171

7272
- Nicolas Bevacqua, [ES6 Number Improvements in Depth](http://ponyfoo.com/articles/es6-number-improvements-in-depth)
73+
- Axel Rauschmayer, [ES proposal: arbitrary precision integers](http://2ality.com/2017/03/es-integer.html)
7374

7475
## 数组
7576

0 commit comments

Comments
 (0)