diff --git a/docs/number.md b/docs/number.md
index 23fe543..b861132 100644
--- a/docs/number.md
+++ b/docs/number.md
@@ -2,18 +2,33 @@
## 二进制和八进制表示法
-ES6提供了二进制和八进制数值的新的写法,分别用前缀`0b`和`0o`表示。
+ES6提供了二进制和八进制数值的新的写法,分别用前缀`0b`(或`0B`)和`0o`(或`0O`)表示。
```javascript
0b111110111 === 503 // true
0o767 === 503 // true
```
-八进制不再允许使用前缀0表示,而改为使用前缀`0o`。
+从ES5开始,在严格模式之中,八进制就不再允许使用前缀`0`表示,ES6进一步明确,要使用前缀`0o`表示。
```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()
@@ -189,11 +204,25 @@ withinErrorMargin(0.2 + 0.2, 0.3)
// false
```
-上面的代码部署了一个误差检查函数。
+上面的代码为浮点数运算,部署了一个误差检查函数。
## 安全整数和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
Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1
@@ -215,10 +244,14 @@ Number.isSafeInteger(null) // false
Number.isSafeInteger(NaN) // 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) // true
-Number.isSafeInteger(1) // true
-Number.isSafeInteger(1.2) // false
Number.isSafeInteger(Number.MAX_SAFE_INTEGER) // true
Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1) // false
```
@@ -373,6 +406,8 @@ JavaScript的整数使用32位二进制形式表示,`Math.clz32`方法返回
Math.clz32(0) // 32
Math.clz32(1) // 31
Math.clz32(1000) // 22
+Math.clz32(0b01000000000000000000000000000000) // 1
+Math.clz32(0b00100000000000000000000000000000) // 2
```
上面代码中,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
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
(0x7fffffff * 0x7fffffff)|0 // 0
@@ -443,7 +478,7 @@ Math.fround(1.5); // 1.5
Math.fround(NaN); // NaN
```
-对于整数来说,Math.fround方法返回结果不会有任何不同,区别主要是那些无法用64个二进制位精确表示的小数。这时,Math.fround方法会返回最接近这个小数的单精度浮点数。
+对于整数来说,`Math.fround`方法返回结果不会有任何不同,区别主要是那些无法用64个二进制位精确表示的小数。这时,`Math.fround`方法会返回最接近这个小数的单精度浮点数。
对于没有部署这个方法的环境,可以用下面的代码模拟。
@@ -477,7 +512,7 @@ ES6新增了4个对数相关方法。
**(1) Math.expm1()**
-`Math.expm1(x)`返回ex - 1。
+`Math.expm1(x)`返回ex - 1,即`Math.exp(x) - 1`。
```javascript
Math.expm1(-1); // -0.6321205588285577
@@ -495,7 +530,7 @@ Math.expm1 = Math.expm1 || function(x) {
**(2)Math.log1p()**
-`Math.log1p(x)`方法返回`1 + x`的自然对数。如果`x`小于-1,返回`NaN`。
+`Math.log1p(x)`方法返回`1 + x`的自然对数,即`Math.log(1 + x)`。如果`x`小于-1,返回`NaN`。
```javascript
Math.log1p(1); // 0.6931471805599453