[TOC]
# JavaScript 的数据类型
数据类型决定了一个数据的特征,即限定了该数据必须按照一定的规则进行操作。
JavaScript 中一共有5中基本数据类型:
1. 字符串型
2. 数值型
3. 布尔型
4. null 型
5. undefined 型
## 內建数据类型概要
在 ECMAScript 标准中,内建数据类型分为5种基本数据类型以及 Object 类型。
## 字符串型
字符串字面量需要用双引号(")或单引号(')括起来。
```javascript
var str1 = "abc";
var str2 = 'abc';
```
### 字符串的运算
由于 JavaScript 的字符串类型是不可变类型,所以字符串值本质上是不能改变的。
```javascript
var str1 = 'abc';
var str2 = 'def';
var str3 = str1 + str2; // 'abcdef'
str1 += '123'; // 'abc123'
```
### 字符串型的比较
JavaScript 有两种等值运算,即 === 和 ==。
```javascript
var str1 = 'abc';
var str2 = str1;
str1 === str2 // true 字符串内容相同
```
还能对字符串进行大小比较,基于 Unicode 字符的编码值
```javascript
var str1 = 'abc';
var str2 = 'def';
str1 < str2 // true
```
### 字符串类(String 类)
字符串型和 String 类之间支持隐式类型转换。
```javascript
var str = '123';
str.length // 3;
```
点运算符的含义是一般意义上的对类方法的调用。上面的代码中,字符串值会先被隐式的转换为字符串对象,然后再读取字符串对象的 length 属性。
### 字符串对象
可以用 `new` 运算符,来显式地生成一个字符串对象。
```javascript
var str = new String('123');
```
字符串值和字符串对象之间可以进行隐式类型。一般来说并不需要在意值和对象之间的区别,字符串对象的比较运算,判断的是两者是否引用了同一个对象,而非两者的内容是否相同。
```javascript
var str1 = new String('123');
var str2 = new String('123');
str1 === str2 // false
```
### 避免混用字符串值和字符串对象
在必要的时候,可以使用 `typeof` 运算来判别一个字符串是字符串值还是字符串对象。字符串对象的运算结果为 object
```javascript
var str1 = new String('123');
typeof str1 // object
```
应该避免显式地生成字符串对象,积极使用隐式数据类型变换,将字符串值转换为字符串对象。
### 调用 String 函数
通过 `new` 运算符调用字符串容易引起混淆,仅通过调用 String 函数就可以生成字符串值。一般来说,使用 String 函数是为了进行显式的数据类型转换。
```javascript
var str = String(47);
typeof str // string
```
### 非破坏性的方法
字符串对象和字符串值一样,是不可变的。不能改写字符串的内容。所有要改变字符串内容的方法,都会生成一个新的字符串对象然后将其返回。
## 数值型
数值的内部结构为64位的浮点小数。
### 数值型的运算
对数值可以进行`+`(加法)、`-`(减法)、`*`(乘法)、`/`(除法)四则运算。通过`%`符号则可以进行求模运算(即计算除法运算后的余数)
### 有关浮点数的常见注意事项
```javascript
0.1 + 0.2 //0.30000000000004
```
### 数值类(Number 类)
经过数据类型转换之后,数值和数值对象也能被视为等价的。
可以通过 `new` 运算符来显式地生成数值对象。如果没有特殊的理由,不建议使用显式的数值对象
```javascript
var num1 = new Number(1);
var num2 = new Number(2);
num1 === num2 // false
typeof num1 // object
```
### 调用 Number 函数
调用 Number 函数的话,将返回对应的数值。需要显示地进行数据类型转换的时候,可以使用 Number 函数。
```javascript
var num1 = Number('1');
typeof num1 // number
```
### 边界值与特殊数值
通过 Number 对象的属性值来获知64位浮点数所支持的最大正值和最小正值。
```javascript
Number.MAX_VALUE // 1.7976931348623157e+308
Number.MIN_VALUE // 5e-324
Number.POSITIVE_INFINITY // Infinity 正无穷大
Number.NEGATIVE_INFINITY // -Infinity 负无穷大
```
### NaN
对 NaN 进行任何运算,其结果都是 NaN。如果在计算过程中出现了一次 NaN,最终的结果就一定会是 NaN。
NaN 不但不与其他任何数值相等,就算是两个 NaN 的等值判断也为 false。
JavaScript 中预定义了一个全局函数 isNaN。来判断一个对象是否为 NaN
```javascript
isNaN({}) // true
isNaN(1) // false
```
## 布尔型
布尔型也被称为逻辑值类型或真假值类型。布尔型只能够取 true 和 false。
### 布尔类(Boolean 类)
通过 Boolean 函数可以将任意值显式地转换为布尔值。
```javascript
var b = Boolean(true);
typeof b // boolean
```
## null 型
null 值的意义存在于对象引用之中。null 值最初的含义为“没有引用任何对象”。null 型只能够取 null 这一个值。null 值是一个字面量。对 null 进行 `typeof` 运算得到的结果是 “object”。要对 null 进行判断,就必须通过和 null 值的等值判断才能确定其类型。
```javascript
typeof null // object
```
null 型没有对应的 Null 类。
## undefined 型
undefined 型只能够取 undefined 这一个值。对 undefined 值进行 `typeof` 运算,其结果为“undefined”。
```javascript
typeof undefined // undefined
```
出现 undefined 的情况
- 为初始化的变量的值
- 不存在属性的值
- 在没有传入实参而调用函数时,该函数内相应参数的值
- 没有 return 语句或是 return 语句中不含表达式的函数的返回值
- 对 void 运算符求值的结果
## Object 类型
除了基本类型之外,其它的所有类型都是 Object 类型。对 Object 类型进行 `typeof` 运算,得到的结果是 “object”。
对一个函数进行 `typeof`运算时,得到的结果为 “function”。
## 数据类型转换
JavaScript 注重的是灵活运用隐式数据类型转换,以写出简洁的代码。
### 从字符串值转换为数值
```javascript
Number('100');
parseInt('100', 10); // 第二个参数为转换时所采用的基数,默认为10
parseInt('100x', 10); // NaN
parseFloat('0.1'); // 0.1
```
在数值运算操作数的位置上书写字符串值,该值就将被隐式地转换为数值类型。
```javascript
'100' - 1 // 99
'100' - '1' // 99
'100' - '' // 100
// 如果操作数中含有字符串值,它就将变为字符串连接运算。这是操作数将被转换为数值类型
'100' + 1 // 1001
1 + '100' // 1100
```
### 从数值转换为字符串值
通常的做法是使用 String 函数,或是在对数值对象进行了隐式数据类型转换之后,再对其调用 toString 方法。
```javascript
typeof String(100); // string
typeof (100).toString(); // string
'foo' + 100 // foo100
100 + 'foo' // 100foo
```
## 转换为布尔型
除以下类型转换后结果 false,其它都为 true。
- 数值0
- 数值 NaN
- null 值
- undefined 值
- 空字符串值
也可使用 `!!` 进行隐式转换
```javascript
!!1 // true
!!0 // false
```
Object 类型再被转换为布尔型之后结果必定为 true