> For the complete documentation index, see [llms.txt](https://note.niefee.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://note.niefee.com/directory/shu-ju-lei-xing-zhuan-huan.md).

# 数据类型转换

* [数据类型转换](https://note.niefee.com/directory/pages/-LjTb6en2sl-89NJHGmV#数据类型转换)
  * [强制转换](https://note.niefee.com/directory/pages/-LjTb6en2sl-89NJHGmV#强制转换)
    * [Number()](/directory/shu-ju-lei-xing-zhuan-huan.md#number)
    * [String()](/directory/shu-ju-lei-xing-zhuan-huan.md#string)
    * [Boolean()](/directory/shu-ju-lei-xing-zhuan-huan.md#boolean)
  * [隐式类型转换](https://note.niefee.com/directory/pages/-LjTb6en2sl-89NJHGmV#隐式类型转换)

## 数据类型转换

### 强制转换

强制转换主要指使用`Number`、`String`和`Boolean`三个构造函数，手动将各种类型的值，转换成数字、字符串或者布尔值。

#### Number()

原始类型的值主要是字符串、布尔值、undefined和null，它们都能被Number转成数值或NaN。

```javascript
// 数值：转换后还是原来的值
Number(324) // 324

// 字符串：如果可以被解析为数值，则转换为相应的数值
Number('324') // 324

// 字符串：如果不可以被解析为数值，返回NaN
Number('324abc') // NaN

// 空字符串转为0
Number('') // 0

// 布尔值：true 转成1，false 转成0
Number(true) // 1
Number(false) // 0

// undefined：转成 NaN
Number(undefined) // NaN

// null：转成0
Number(null) // 0
```

`Number`背后的规则：

1. 调用对象自身的`valueOf`方法。如果返回原始类型的值，则直接对该值使用`Number`函数，不再进行后续步骤。
2. 如果`valueOf`方法返回的还是对象，则改为调用对象自身的`toString`方法。如果`toString`方法返回原始类型的值，则对该值使用Number函数，不再进行后续步骤。
3. 如果`toString`方法返回的是对象，就报错。

```javascript
var obj = {x: 1};
Number(obj) // NaN

// 等同于
if (typeof obj.valueOf() === 'object') {
  Number(obj.toString());
} else {
  Number(obj.valueOf());
}
```

* `toString()`,它的作用是返回一个反映这个对象的字符串;
  * 对于值类型数据(`number`、`string`、`boolean`、`null`和`undefined`)使用而言，其效果相当于类型转换，将原类型强转为字符。
  * 对于数组Array会以逗号分隔返回。
  * 对于对象,返回`[object objectname]`，其中 objectname 是对象类型的名称。
* `valueOf()`,将对象转换成原始类型的值（数值、字符串和布尔值等），并返回;

  > [具体返回结果](http://www.cnblogs.com/GreenLeaves/p/5893551.html)

#### String()

原始类型值的转换规则

* **数值**：转为相应的字符串。
* **字符串**：转换后还是原来的值。
* **布尔值**：true转为"true"，false转为"false"。
* **undefined**：转为"undefined"。
* **null**：转为"null"。

`String`方法背后的转换规则，与`Number`方法基本相同，只是互换了`valueOf`方法和`toString`方法的执行顺序。

1. 先调用对象自身的toString方法。如果返回原始类型的值，则对该值使用String函数，不再进行以下步骤。
2. 如果toString方法返回的是对象，再调用原对象的valueOf方法。如果valueOf方法返回原始类型的值，则对该值使用String函数，不再进行以下步骤。
3. 如果valueOf方法返回的是对象，就报错。

```javascript
String({a: 1})
// "[object Object]"

// 等同于

String({a: 1}.toString())
// "[object Object]"
```

#### Boolean()

除了以下六个值的转换结果为`false`，其他的值全部为`true`。

```javascript
Boolean(undefined) // false
Boolean(null) // false
Boolean(-0) // false
Boolean(0) // false
Boolean(+0) // false
Boolean(NaN) // false
Boolean('') // false
```

> <http://javascript.ruanyifeng.com/grammar/conversion.html> <https://segmentfault.com/a/1190000008432611>
>
> **原始值/原始类型值**指的是\['Null','Undefined','String','Boolean','Number']五种基本数据类型之一

### 隐式类型转换

隐式类型转换是这样的：预期什么类型的值，就调用该类型的转换函数。比如，某个位置预期为字符串，就调用String函数进行转换。如果该位置即可以是字符串，也可能是数值，那么默认转为数值。
