Skip to content

Commit b70cef1

Browse files
committed
docs(proposals): edit proposals
1 parent 3c4b9d1 commit b70cef1

File tree

2 files changed

+194
-117
lines changed

2 files changed

+194
-117
lines changed

docs/number.md

Lines changed: 0 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -655,38 +655,6 @@ ES6 新增了 6 个双曲函数方法。
655655
- `Math.acosh(x)` 返回`x`的反双曲余弦(inverse hyperbolic cosine)
656656
- `Math.atanh(x)` 返回`x`的反双曲正切(inverse hyperbolic tangent)
657657

658-
## Math.signbit()
659-
660-
`Math.sign()`用来判断一个值的正负,但是如果参数是`-0`,它会返回`-0`
661-
662-
```javascript
663-
Math.sign(-0) // -0
664-
```
665-
666-
这导致对于判断符号位的正负,`Math.sign()`不是很有用。JavaScript 内部使用 64 位浮点数(国际标准 IEEE 754)表示数值,IEEE 754 规定第一位是符号位,`0`表示正数,`1`表示负数。所以会有两种零,`+0`是符号位为`0`时的零值,`-0`是符号位为`1`时的零值。实际编程中,判断一个值是`+0`还是`-0`非常麻烦,因为它们是相等的。
667-
668-
```javascript
669-
+0 === -0 // true
670-
```
671-
672-
目前,有一个[提案](http://jfbastien.github.io/papers/Math.signbit.html),引入了`Math.signbit()`方法判断一个数的符号位是否设置了。
673-
674-
```javascript
675-
Math.signbit(2) //false
676-
Math.signbit(-2) //true
677-
Math.signbit(0) //false
678-
Math.signbit(-0) //true
679-
```
680-
681-
可以看到,该方法正确返回了`-0`的符号位是设置了的。
682-
683-
该方法的算法如下。
684-
685-
- 如果参数是`NaN`,返回`false`
686-
- 如果参数是`-0`,返回`true`
687-
- 如果参数是负值,返回`true`
688-
- 其他情况返回`false`
689-
690658
## 指数运算符
691659

692660
ES2016 新增了一个指数运算符(`**`)。
@@ -719,88 +687,3 @@ Math.pow(99, 99)
719687
```
720688

721689
上面代码中,两个运算结果的最后一位有效数字是有差异的。
722-
723-
## Integer 数据类型
724-
725-
### 简介
726-
727-
JavaScript 所有数字都保存成 64 位浮点数,这决定了整数的精确程度只能到 53 个二进制位。大于这个范围的整数,JavaScript 是无法精确表示的,这使得 JavaScript 不适合进行科学和金融方面的精确计算。
728-
729-
现在有一个[提案](https://github.com/tc39/proposal-bigint),引入了新的数据类型 Integer(整数),来解决这个问题。整数类型的数据只用来表示整数,没有位数的限制,任何位数的整数都可以精确表示。
730-
731-
为了与 Number 类型区别,Integer 类型的数据必须使用后缀`n`表示。
732-
733-
```javascript
734-
1n + 2n // 3n
735-
```
736-
737-
二进制、八进制、十六进制的表示法,都要加上后缀`n`
738-
739-
```javascript
740-
0b1101n // 二进制
741-
0o777n // 八进制
742-
0xFFn // 十六进制
743-
```
744-
745-
`typeof`运算符对于 Integer 类型的数据返回`integer`
746-
747-
```javascript
748-
typeof 123n
749-
// 'integer'
750-
```
751-
752-
JavaScript 原生提供`Integer`对象,用来生成 Integer 类型的数值。转换规则基本与`Number()`一致。
753-
754-
```javascript
755-
Integer(123) // 123n
756-
Integer('123') // 123n
757-
Integer(false) // 0n
758-
Integer(true) // 1n
759-
```
760-
761-
以下的用法会报错。
762-
763-
```javascript
764-
new Integer() // TypeError
765-
Integer(undefined) //TypeError
766-
Integer(null) // TypeError
767-
Integer('123n') // SyntaxError
768-
Integer('abc') // SyntaxError
769-
```
770-
771-
### 运算
772-
773-
在数学运算方面,Integer 类型的`+``-``*``**`这四个二元运算符,与 Number 类型的行为一致。除法运算`/`会舍去小数部分,返回一个整数。
774-
775-
```javascript
776-
9n / 5n
777-
// 1n
778-
```
779-
780-
几乎所有的 Number 运算符都可以用在 Integer,但是有两个除外:不带符号的右移位运算符`>>>`和一元的求正运算符`+`,使用时会报错。前者是因为`>>>`要求最高位补 0,但是 Integer 类型没有最高位,导致这个运算符无意义。后者是因为一元运算符`+`在 asm.js 里面总是返回 Number 类型或者报错。
781-
782-
Integer 类型不能与 Number 类型进行混合运算。
783-
784-
```javascript
785-
1n + 1
786-
// 报错
787-
```
788-
789-
这是因为无论返回的是 Integer 或 Number,都会导致丢失信息。比如`(2n**53n + 1n) + 0.5`这个表达式,如果返回 Integer 类型,`0.5`这个小数部分会丢失;如果返回 Number 类型,会超过 53 位精确数字,精度下降。
790-
791-
相等运算符(`==`)会改变数据类型,也是不允许混合使用。
792-
793-
```javascript
794-
0n == 0
795-
// 报错 TypeError
796-
797-
0n == false
798-
// 报错 TypeError
799-
```
800-
801-
精确相等运算符(`===`)不会改变数据类型,因此可以混合使用。
802-
803-
```javascript
804-
0n === 0
805-
// false
806-
```

docs/proposals.md

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,3 +387,197 @@ const userAge = userId |> await fetchUserById |> getAgeFromUser;
387387
const userAge = getAgeFromUser(await fetchUserById(userId));
388388
```
389389
390+
## 数值分隔符
391+
392+
欧美语言中,较长的数值允许每三位添加一个分隔符(通常是一个逗号),增加数值的可读性。比如,`1000`可以写作`1,000`
393+
394+
现在有一个[提案](https://github.com/tc39/proposal-numeric-separator),允许 JavaScript 的数值使用下划线(`_`)作为分隔符。
395+
396+
```javascript
397+
let budget = 1_000_000_000_000;
398+
budget === 10 ** 12 // true
399+
```
400+
401+
JavaScript 的数值分隔符没有指定间隔的位数,也就是说,可以每三位添加一个分隔符,也可以每一位、每两位、每四位添加一个。
402+
403+
```javascript
404+
123_00 === 12_300 // true
405+
406+
12345_00 === 123_4500 // true
407+
12345_00 === 1_234_500 // true
408+
```
409+
410+
小数和科学计数法也可以使用数值分隔符。
411+
412+
```javascript
413+
// 小数
414+
0.000_001
415+
// 科学计数法
416+
1e10_000
417+
```
418+
419+
数值分隔符有几个使用注意点。
420+
421+
- 不能在数值的最前面(leading)或最后面(trailing)。
422+
- 不能两个或两个以上的分隔符连在一起。
423+
- 小数点的前后不能有分隔符。
424+
- 科学计数法里面,表示指数的`e``E`前后不能有分隔符。
425+
426+
下面的写法都会报错。
427+
428+
```javascript
429+
// 全部报错
430+
3_.141
431+
3._141
432+
1_e12
433+
1e_12
434+
123__456
435+
_1464301
436+
1464301_
437+
```
438+
439+
除了十进制,其他进制的数值也可以使用分隔符。
440+
441+
```javascript
442+
// 二进制
443+
0b1010_0001_1000_0101
444+
// 十六进制
445+
0xA0_B0_C0
446+
```
447+
448+
注意,分隔符不能紧跟着进制的前缀`0b``0B``0o``0O``0x``0X`
449+
450+
```javascript
451+
// 报错
452+
0_b111111000
453+
0b_111111000
454+
```
455+
456+
下面三个将字符串转成数值的函数,不支持数值分隔符。主要原因是提案的设计者认为,数值分隔符主要是为了编码时书写数值的方便,而不是为了处理外部输入的数据。
457+
458+
- Number()
459+
- parseInt()
460+
- parseFloat()
461+
462+
```javascript
463+
Number('123_456') // NaN
464+
parseInt('123_456') // 123
465+
```
466+
467+
## Integer 数据类型
468+
469+
### 简介
470+
471+
JavaScript 所有数字都保存成 64 位浮点数,这决定了整数的精确程度只能到 53 个二进制位。大于这个范围的整数,JavaScript 是无法精确表示的,这使得 JavaScript 不适合进行科学和金融方面的精确计算。
472+
473+
现在有一个[提案](https://github.com/tc39/proposal-bigint),引入了新的数据类型 Integer(整数),来解决这个问题。整数类型的数据只用来表示整数,没有位数的限制,任何位数的整数都可以精确表示。
474+
475+
为了与 Number 类型区别,Integer 类型的数据必须使用后缀`n`表示。
476+
477+
```javascript
478+
1n + 2n // 3n
479+
```
480+
481+
二进制、八进制、十六进制的表示法,都要加上后缀`n`
482+
483+
```javascript
484+
0b1101n // 二进制
485+
0o777n // 八进制
486+
0xFFn // 十六进制
487+
```
488+
489+
`typeof`运算符对于 Integer 类型的数据返回`integer`
490+
491+
```javascript
492+
typeof 123n
493+
// 'integer'
494+
```
495+
496+
JavaScript 原生提供`Integer`对象,用来生成 Integer 类型的数值。转换规则基本与`Number()`一致。
497+
498+
```javascript
499+
Integer(123) // 123n
500+
Integer('123') // 123n
501+
Integer(false) // 0n
502+
Integer(true) // 1n
503+
```
504+
505+
以下的用法会报错。
506+
507+
```javascript
508+
new Integer() // TypeError
509+
Integer(undefined) //TypeError
510+
Integer(null) // TypeError
511+
Integer('123n') // SyntaxError
512+
Integer('abc') // SyntaxError
513+
```
514+
515+
### 运算
516+
517+
在数学运算方面,Integer 类型的`+``-``*``**`这四个二元运算符,与 Number 类型的行为一致。除法运算`/`会舍去小数部分,返回一个整数。
518+
519+
```javascript
520+
9n / 5n
521+
// 1n
522+
```
523+
524+
几乎所有的 Number 运算符都可以用在 Integer,但是有两个除外:不带符号的右移位运算符`>>>`和一元的求正运算符`+`,使用时会报错。前者是因为`>>>`要求最高位补 0,但是 Integer 类型没有最高位,导致这个运算符无意义。后者是因为一元运算符`+`在 asm.js 里面总是返回 Number 类型或者报错。
525+
526+
Integer 类型不能与 Number 类型进行混合运算。
527+
528+
```javascript
529+
1n + 1
530+
// 报错
531+
```
532+
533+
这是因为无论返回的是 Integer 或 Number,都会导致丢失信息。比如`(2n**53n + 1n) + 0.5`这个表达式,如果返回 Integer 类型,`0.5`这个小数部分会丢失;如果返回 Number 类型,会超过 53 位精确数字,精度下降。
534+
535+
相等运算符(`==`)会改变数据类型,也是不允许混合使用。
536+
537+
```javascript
538+
0n == 0
539+
// 报错 TypeError
540+
541+
0n == false
542+
// 报错 TypeError
543+
```
544+
545+
精确相等运算符(`===`)不会改变数据类型,因此可以混合使用。
546+
547+
```javascript
548+
0n === 0
549+
// false
550+
```
551+
552+
## Math.signbit()
553+
554+
`Math.sign()`用来判断一个值的正负,但是如果参数是`-0`,它会返回`-0`
555+
556+
```javascript
557+
Math.sign(-0) // -0
558+
```
559+
560+
这导致对于判断符号位的正负,`Math.sign()`不是很有用。JavaScript 内部使用 64 位浮点数(国际标准 IEEE 754)表示数值,IEEE 754 规定第一位是符号位,`0`表示正数,`1`表示负数。所以会有两种零,`+0`是符号位为`0`时的零值,`-0`是符号位为`1`时的零值。实际编程中,判断一个值是`+0`还是`-0`非常麻烦,因为它们是相等的。
561+
562+
```javascript
563+
+0 === -0 // true
564+
```
565+
566+
目前,有一个[提案](http://jfbastien.github.io/papers/Math.signbit.html),引入了`Math.signbit()`方法判断一个数的符号位是否设置了。
567+
568+
```javascript
569+
Math.signbit(2) //false
570+
Math.signbit(-2) //true
571+
Math.signbit(0) //false
572+
Math.signbit(-0) //true
573+
```
574+
575+
可以看到,该方法正确返回了`-0`的符号位是设置了的。
576+
577+
该方法的算法如下。
578+
579+
- 如果参数是`NaN`,返回`false`
580+
- 如果参数是`-0`,返回`true`
581+
- 如果参数是负值,返回`true`
582+
- 其他情况返回`false`
583+

0 commit comments

Comments
 (0)