[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