1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-28 21:32:20 +00:00

edit number

This commit is contained in:
ruanyf 2015-10-22 11:59:23 +08:00
parent 2fc2441269
commit 3965d546f2

View File

@ -2,18 +2,33 @@
## 二进制和八进制表示法 ## 二进制和八进制表示法
ES6提供了二进制和八进制数值的新的写法分别用前缀`0b``0o`表示。 ES6提供了二进制和八进制数值的新的写法分别用前缀`0b`(或`0B``0o`(或`0O`表示。
```javascript ```javascript
0b111110111 === 503 // true 0b111110111 === 503 // true
0o767 === 503 // true 0o767 === 503 // true
``` ```
八进制不再允许使用前缀0表示而改为使用前缀`0o` 从ES5开始在严格模式之中八进制就不再允许使用前缀`0`表示ES6进一步明确要使用前缀`0o`表示
```javascript ```javascript
011 === 9 // 不正确 // 非严格模式
0o11 === 9 // 正确 (function(){
console.log(0o11 === 011);
})() // true
// 严格模式
(function(){
'use strict';
console.log(0o11 === 011);
})() // Uncaught SyntaxError: Octal literals are not allowed in strict mode.
```
如果要将`0b``0x`前缀的字符串数值转为十进制,要使用`Number`方法。
```javascript
Number('0b111') // 7
Number('0o10') // 8
``` ```
## Number.isFinite(), Number.isNaN() ## Number.isFinite(), Number.isNaN()
@ -189,11 +204,25 @@ withinErrorMargin(0.2 + 0.2, 0.3)
// false // false
``` ```
上面的代码部署了一个误差检查函数。 上面的代码为浮点数运算,部署了一个误差检查函数。
## 安全整数和Number.isSafeInteger() ## 安全整数和Number.isSafeInteger()
JavaScript能够准确表示的整数范围在`-2^53``2^53`之间不含两个端点。ES6引入了`Number.MAX_SAFE_INTEGER``Number.MIN_SAFE_INTEGER`这两个常量,用来表示这个范围的上下限。 JavaScript能够准确表示的整数范围在`-2^53``2^53`之间(不含两个端点),超过这个范围,无法精确表示这个值。
```javascript
Math.pow(2, 53) // 9007199254740992
9007199254740992 // 9007199254740992
9007199254740993 // 9007199254740992
Math.pow(2, 53) === Math.pow(2, 53) + 1
// true
```
上面代码中超出2的53次方之后一个数就不精确了。
ES6引入了`Number.MAX_SAFE_INTEGER``Number.MIN_SAFE_INTEGER`这两个常量,用来表示这个范围的上下限。
```javascript ```javascript
Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1 Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1
@ -215,10 +244,14 @@ Number.isSafeInteger(null) // false
Number.isSafeInteger(NaN) // false Number.isSafeInteger(NaN) // false
Number.isSafeInteger(Infinity) // false Number.isSafeInteger(Infinity) // false
Number.isSafeInteger(-Infinity) // false Number.isSafeInteger(-Infinity) // false
Number.isSafeInteger(3) // true
Number.isSafeInteger(1.2) // false
Number.isSafeInteger(9007199254740990) // true
Number.isSafeInteger(9007199254740992) // false
Number.isSafeInteger(Number.MIN_SAFE_INTEGER - 1) // false Number.isSafeInteger(Number.MIN_SAFE_INTEGER - 1) // false
Number.isSafeInteger(Number.MIN_SAFE_INTEGER) // true Number.isSafeInteger(Number.MIN_SAFE_INTEGER) // true
Number.isSafeInteger(1) // true
Number.isSafeInteger(1.2) // false
Number.isSafeInteger(Number.MAX_SAFE_INTEGER) // true Number.isSafeInteger(Number.MAX_SAFE_INTEGER) // true
Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1) // false Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1) // false
``` ```
@ -373,6 +406,8 @@ JavaScript的整数使用32位二进制形式表示`Math.clz32`方法返回
Math.clz32(0) // 32 Math.clz32(0) // 32
Math.clz32(1) // 31 Math.clz32(1) // 31
Math.clz32(1000) // 22 Math.clz32(1000) // 22
Math.clz32(0b01000000000000000000000000000000) // 1
Math.clz32(0b00100000000000000000000000000000) // 2
``` ```
上面代码中0的二进制形式全为0所以有32个前导01的二进制形式是`0b1`只占1位所以32位之中有31个前导01000的二进制形式是`0b1111101000`一共有10位所以32位之中有22个前导0。 上面代码中0的二进制形式全为0所以有32个前导01的二进制形式是`0b1`只占1位所以32位之中有31个前导01000的二进制形式是`0b1111101000`一共有10位所以32位之中有22个前导0。
@ -419,7 +454,7 @@ Math.imul(-1, 8); // -8
Math.imul(-2, -2); // 4 Math.imul(-2, -2); // 4
``` ```
如果只考虑最后32位(含第一个整数位),大多数情况下,`Math.imul(a, b)``a * b`的结果是相同的,即该方法等同于`(a * b)|0`的效果超过32位的部分溢出。之所以需要部署这个方法是因为JavaScript有精度限制超过2的53次方的值无法精确表示。这就是说对于那些很大的数的乘法低位数值往往都是不精确的`Math.imul`方法可以返回正确的低位数值。 如果只考虑最后32位大多数情况下`Math.imul(a, b)``a * b`的结果是相同的,即该方法等同于`(a * b)|0`的效果超过32位的部分溢出。之所以需要部署这个方法是因为JavaScript有精度限制超过2的53次方的值无法精确表示。这就是说对于那些很大的数的乘法低位数值往往都是不精确的`Math.imul`方法可以返回正确的低位数值。
```javascript ```javascript
(0x7fffffff * 0x7fffffff)|0 // 0 (0x7fffffff * 0x7fffffff)|0 // 0
@ -443,7 +478,7 @@ Math.fround(1.5); // 1.5
Math.fround(NaN); // NaN Math.fround(NaN); // NaN
``` ```
对于整数来说Math.fround方法返回结果不会有任何不同区别主要是那些无法用64个二进制位精确表示的小数。这时Math.fround方法会返回最接近这个小数的单精度浮点数。 对于整数来说,`Math.fround`方法返回结果不会有任何不同区别主要是那些无法用64个二进制位精确表示的小数。这时`Math.fround`方法会返回最接近这个小数的单精度浮点数。
对于没有部署这个方法的环境,可以用下面的代码模拟。 对于没有部署这个方法的环境,可以用下面的代码模拟。
@ -477,7 +512,7 @@ ES6新增了4个对数相关方法。
**1 Math.expm1()** **1 Math.expm1()**
`Math.expm1(x)`返回e<sub>x</sub> - 1。 `Math.expm1(x)`返回e<sub>x</sub> - 1,即`Math.exp(x) - 1`
```javascript ```javascript
Math.expm1(-1); // -0.6321205588285577 Math.expm1(-1); // -0.6321205588285577
@ -495,7 +530,7 @@ Math.expm1 = Math.expm1 || function(x) {
**2Math.log1p()** **2Math.log1p()**
`Math.log1p(x)`方法返回`1 + x`的自然对数。如果`x`小于-1返回`NaN` `Math.log1p(x)`方法返回`1 + x`的自然对数,即`Math.log(1 + x)`。如果`x`小于-1返回`NaN`
```javascript ```javascript
Math.log1p(1); // 0.6931471805599453 Math.log1p(1); // 0.6931471805599453