2
2
3
3
## 二进制和八进制表示法
4
4
5
- ES6提供了二进制和八进制数值的新的写法,分别用前缀` 0b ` 和` 0o ` 表示。
5
+ ES6提供了二进制和八进制数值的新的写法,分别用前缀` 0b ` (或 ` 0B ` ) 和` 0o ` (或 ` 0O ` ) 表示。
6
6
7
7
``` javascript
8
8
0b111110111 === 503 // true
9
9
0o767 === 503 // true
10
10
```
11
11
12
- 八进制不再允许使用前缀0表示,而改为使用前缀 ` 0o ` 。
12
+ 从ES5开始,在严格模式之中,八进制就不再允许使用前缀 ` 0 ` 表示,ES6进一步明确,要使用前缀 ` 0o ` 表示 。
13
13
14
14
``` javascript
15
- 011 === 9 // 不正确
16
- 0o11 === 9 // 正确
15
+ // 非严格模式
16
+ (function (){
17
+ console .log (0o11 === 011 );
18
+ })() // true
19
+
20
+ // 严格模式
21
+ (function (){
22
+ ' use strict' ;
23
+ console .log (0o11 === 011 );
24
+ })() // Uncaught SyntaxError: Octal literals are not allowed in strict mode.
25
+ ```
26
+
27
+ 如果要将` 0b ` 和` 0x ` 前缀的字符串数值转为十进制,要使用` Number ` 方法。
28
+
29
+ ``` javascript
30
+ Number (' 0b111' ) // 7
31
+ Number (' 0o10' ) // 8
17
32
```
18
33
19
34
## Number.isFinite(), Number.isNaN()
@@ -189,11 +204,25 @@ withinErrorMargin(0.2 + 0.2, 0.3)
189
204
// false
190
205
```
191
206
192
- 上面的代码部署了一个误差检查函数 。
207
+ 上面的代码为浮点数运算,部署了一个误差检查函数 。
193
208
194
209
## 安全整数和Number.isSafeInteger()
195
210
196
- JavaScript能够准确表示的整数范围在` -2^53 ` 到` 2^53 ` 之间(不含两个端点)。ES6引入了` Number.MAX_SAFE_INTEGER ` 和` Number.MIN_SAFE_INTEGER ` 这两个常量,用来表示这个范围的上下限。
211
+ JavaScript能够准确表示的整数范围在` -2^53 ` 到` 2^53 ` 之间(不含两个端点),超过这个范围,无法精确表示这个值。
212
+
213
+ ``` javascript
214
+ Math .pow (2 , 53 ) // 9007199254740992
215
+
216
+ 9007199254740992 // 9007199254740992
217
+ 9007199254740993 // 9007199254740992
218
+
219
+ Math .pow (2 , 53 ) === Math .pow (2 , 53 ) + 1
220
+ // true
221
+ ```
222
+
223
+ 上面代码中,超出2的53次方之后,一个数就不精确了。
224
+
225
+ ES6引入了` Number.MAX_SAFE_INTEGER ` 和` Number.MIN_SAFE_INTEGER ` 这两个常量,用来表示这个范围的上下限。
197
226
198
227
``` javascript
199
228
Number .MAX_SAFE_INTEGER === Math .pow (2 , 53 ) - 1
@@ -215,10 +244,14 @@ Number.isSafeInteger(null) // false
215
244
Number .isSafeInteger (NaN ) // false
216
245
Number .isSafeInteger (Infinity ) // false
217
246
Number .isSafeInteger (- Infinity ) // false
247
+
248
+ Number .isSafeInteger (3 ) // true
249
+ Number .isSafeInteger (1.2 ) // false
250
+ Number .isSafeInteger (9007199254740990 ) // true
251
+ Number .isSafeInteger (9007199254740992 ) // false
252
+
218
253
Number .isSafeInteger (Number .MIN_SAFE_INTEGER - 1 ) // false
219
254
Number .isSafeInteger (Number .MIN_SAFE_INTEGER ) // true
220
- Number .isSafeInteger (1 ) // true
221
- Number .isSafeInteger (1.2 ) // false
222
255
Number .isSafeInteger (Number .MAX_SAFE_INTEGER ) // true
223
256
Number .isSafeInteger (Number .MAX_SAFE_INTEGER + 1 ) // false
224
257
```
@@ -373,6 +406,8 @@ JavaScript的整数使用32位二进制形式表示,`Math.clz32`方法返回
373
406
Math .clz32 (0 ) // 32
374
407
Math .clz32 (1 ) // 31
375
408
Math .clz32 (1000 ) // 22
409
+ Math .clz32 (0b01000000000000000000000000000000 ) // 1
410
+ Math .clz32 (0b00100000000000000000000000000000 ) // 2
376
411
```
377
412
378
413
上面代码中,0的二进制形式全为0,所以有32个前导0;1的二进制形式是` 0b1 ` ,只占1位,所以32位之中有31个前导0;1000的二进制形式是` 0b1111101000 ` ,一共有10位,所以32位之中有22个前导0。
@@ -419,7 +454,7 @@ Math.imul(-1, 8); // -8
419
454
Math .imul (- 2 , - 2 ); // 4
420
455
```
421
456
422
- 如果只考虑最后32位(含第一个整数位) ,大多数情况下,` Math.imul(a, b) ` 与` a * b ` 的结果是相同的,即该方法等同于` (a * b)|0 ` 的效果(超过32位的部分溢出)。之所以需要部署这个方法,是因为JavaScript有精度限制,超过2的53次方的值无法精确表示。这就是说,对于那些很大的数的乘法,低位数值往往都是不精确的,` Math.imul ` 方法可以返回正确的低位数值。
457
+ 如果只考虑最后32位,大多数情况下,` Math.imul(a, b) ` 与` a * b ` 的结果是相同的,即该方法等同于` (a * b)|0 ` 的效果(超过32位的部分溢出)。之所以需要部署这个方法,是因为JavaScript有精度限制,超过2的53次方的值无法精确表示。这就是说,对于那些很大的数的乘法,低位数值往往都是不精确的,` Math.imul ` 方法可以返回正确的低位数值。
423
458
424
459
``` javascript
425
460
(0x7fffffff * 0x7fffffff )| 0 // 0
@@ -443,7 +478,7 @@ Math.fround(1.5); // 1.5
443
478
Math .fround (NaN ); // NaN
444
479
```
445
480
446
- 对于整数来说,Math.fround方法返回结果不会有任何不同 ,区别主要是那些无法用64个二进制位精确表示的小数。这时,Math.fround方法会返回最接近这个小数的单精度浮点数 。
481
+ 对于整数来说,` Math.fround ` 方法返回结果不会有任何不同 ,区别主要是那些无法用64个二进制位精确表示的小数。这时,` Math.fround ` 方法会返回最接近这个小数的单精度浮点数 。
447
482
448
483
对于没有部署这个方法的环境,可以用下面的代码模拟。
449
484
@@ -477,7 +512,7 @@ ES6新增了4个对数相关方法。
477
512
478
513
** (1) Math.expm1()**
479
514
480
- ` Math.expm1(x) ` 返回e<sub >x</sub > - 1。
515
+ ` Math.expm1(x) ` 返回e<sub >x</sub > - 1,即 ` Math.exp(x) - 1 ` 。
481
516
482
517
``` javascript
483
518
Math .expm1 (- 1 ); // -0.6321205588285577
@@ -495,7 +530,7 @@ Math.expm1 = Math.expm1 || function(x) {
495
530
496
531
** (2)Math.log1p()**
497
532
498
- ` Math.log1p(x) ` 方法返回` 1 + x ` 的自然对数。如果` x ` 小于-1,返回` NaN ` 。
533
+ ` Math.log1p(x) ` 方法返回` 1 + x ` 的自然对数,即 ` Math.log(1 + x) ` 。如果` x ` 小于-1,返回` NaN ` 。
499
534
500
535
``` javascript
501
536
Math .log1p (1 ); // 0.6931471805599453
0 commit comments