> For the complete documentation index, see [llms.txt](https://jaimecheng.gitbook.io/javascript/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jaimecheng.gitbook.io/javascript/datatype/number.md).

# Number

## 数值字面量    <a href="#number-literal-format" id="number-literal-format"></a>

* 最基本的数值字面量格式是十进制整数；
* 整数还可以通过八进制或十六进制的字面值来表示；八进制字面值的第一位必须是零(0)，然后是八进制数字序列(0\~7)。如果字面值中的数值超出了范围，那么前导零将被忽略，后面的数值将被当作十进制数值解析；
* ```javascript
  var octalNum1 = 070; // 八进制的 56
  var octalNum2 = 079; // 无效的八进制数值——解析为 79
  var octalNum3 = 08; // 无效的八进制数值——解析为 8
  ```
* e 表示法，10的指数次幂，`3.125e3` 表示 `3.125*10^3`，`3.125e-3` 表示 `3.125*10^-3`；
* 浮点数值的最高精度是 17 位小数，但在进行算术计算时其精确度远远不如整数，浮点计算的误差是使用基于 IEEE754 数值的浮点计算的通病，永远不要测试某个特定的浮点数值；

## 数值范围   <a href="#range" id="range"></a>

* ECMAScript 能够表示的最小数值保 存在 `Number.MIN_VALUE` 中—在大多数浏览器中，这个值是 `5e-324`；
* 能够表示的最大数值保存在 `Number.MAX_VALUE` 中—在大多数浏览器中，该值是`1.7976931348623157e+308`；
* 超出数值范围的值，将被自动转换成特殊的 `Infinity` 值。负数会被转换成 `-Infinity` (负无穷)，正数则会被转换成 `Infinity` (正无穷)，`Infinity` 不能够参与计算；
* `Number.NEGATIVE_INFINITY` 和 `Number.POSITIVE_INFINITY` 分别保存 `-Infinity` 和 `Infinity`；
* 正数除以 0 返回 `Infinity`，负数除以 0 返回 `-Infinity`；
* `isFinite()` 函数，检验参数是否位于最小与最大数值之间，返回 `true/false`；
* 监测和监控极大或极小数值的必要性；

## NaN   <a href="#nan" id="nan"></a>

* `NaN` 的特殊性，用于表示一个本来要返回数值的操作数未返回数值的情况；
* 任何涉及 `NaN` 的操作(例如 `NaN/10` )都会返回 `NaN`；
* `NaN` 与任何值都不相等，包括 `NaN` 本身，`NaN == NaN; // false`；
* 0 除以 0 才会返回 `NaN`；
* `typeof NaN;` 返回 `"number"`；
* `isNaN()` 函数，接受一个参数，确定这个参数是否“不是数值”。`isNaN()` 在接收到一个值之后，会将这个值转换为数值。某些不是数值的值会直接转换为数值，例如字符串 `"10"` 或 `Boolean` 值。而任何不能被转换为数值的值都会导致这个函数返回 `true`；

## 数值转换   <a href="#conversions" id="conversions"></a>

* **Number()**，用于任何数据类型，一元加操作符的操作与 `Number()` 函数相同，转换规则如下：

  |      数据类型     | Number()结果                                                                                                    |
  | :-----------: | ------------------------------------------------------------------------------------------------------------- |
  |  **Boolean**  | 0 或 1                                                                                                         |
  |    **Null**   | 0                                                                                                             |
  | **Undefined** | NaN                                                                                                           |
  |   **Number**  | 简单的传入和返回                                                                                                      |
  |   **String**  | 空字符串，则将其转换为 0； 只包含数字，则将其转换为十进制数值，忽略前导0； 包含有效的浮点格式，则转换为对应的浮点数值； 包含有效的十六进制格式，则转换为十进制整 数值； 包含除上述格式之外的字符，则转换为 NaN |
  |   **Object**  | 调用 `valueOf()` 方法，依照前面的规则转换返回的值。如果转换的结果是 NaN，则调用 `toString()` 方法，然后再次依照前面的规则转换返回的字符串值                         |
* ```javascript
  Number({}); // NaN
  Number([]); // 0
  Number([2]); // 2
  Number([2,3]); // NaN
  ```
* **parseInt()**，string => number(整数)，会忽略前面的空直至找到第一个非空格字符，`Number()` 函数在转换字符串时比较复杂而且不够合理，因此在处理整数的时候更常用的是 `parseInt()` 函数，转换规则如下：

  |    数据类型    | parseInt()结果                                                                                                                          |
  | :--------: | ------------------------------------------------------------------------------------------------------------------------------------- |
  | **String** | 空字符串，则将其转换为 NaN； 第一个字符不是数字字符或者负号，转换为 NaN； 如果第一个字符是数字字符，会继续向后解析直到结束或遇见非数字字符 以"0x"开头且后跟数字字符，就会将其当作一个十六进制整数； 以"0"开头且后跟数字字符，则会将其当作一个八进制数； |
* ```javascript
  var num1 = parseInt("1234blue");  // 1234
  var num2 = parseInt("");  // NaN
  var num3 = parseInt("0xA"); // 10(十六进制数)
  var num4 = parseInt(22.5); // 22
  var num5 = parseInt("070"); // 56(八进制数)
  var num6 = parseInt("70"); // 70(十进制数) 
  var num7 = parseInt("0xf"); // 15(十六进制数)

  var num1 = parseInt("10", 2); //2 (按二进制解析) 
  var num2 = parseInt("10", 8); //8 (按八进制解析)
  var num3 = parseInt("10", 10); //10 (按十进制解析)
  var num4 = parseInt("10", 16); //16 (按十六进制解析)
  ```
* **parseFloat()**，string => number(浮点数)，与 `parseInt()` 函数类似，但只解析十进制值，规则如下：

  |    数据类型    | parseInt()结果                                                                                                                              |
  | :--------: | ----------------------------------------------------------------------------------------------------------------------------------------- |
  | **String** | 空字符串，则将其转换为 NaN； 第一个字符不是数字字符或者负号，转换为 NaN； 如果第一个字符是数字字符，会继续向后解析直到结束或遇见非数字字符 十六进制格式的字符串则始终会被转换成 0； 如果字符串包含的是一个可解析为整数的数`parseFloat()` 会返回整数； |
