File tree Expand file tree Collapse file tree 2 files changed +86
-0
lines changed Expand file tree Collapse file tree 2 files changed +86
-0
lines changed Original file line number Diff line number Diff line change @@ -680,3 +680,88 @@ Math.pow(99, 99)
680
680
681
681
上面代码中,两个运算结果的最后一位有效数字是有差异的。
682
682
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
+
Original file line number Diff line number Diff line change 70
70
## 数值
71
71
72
72
- 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 )
73
74
74
75
## 数组
75
76
You can’t perform that action at this time.
0 commit comments