[TOC]
# **String:字符串類型**
String類型用于表示由零或多個16位Unicode字符組成的字符序列,即字符串 。
<br>
## **1、存儲結構**
  由于計算機只能處理數字,如果要處理文本,就必須先把文本轉換為數字才能處理。在計算機中,1個字節(byte)由 8個比特(bit)組成,所以 1 個字節能表示的最大整數就是 255,如果想表示更大整數,就必須用更多的字節,比如 2 個字節可以表示的最大整數為 65535 。最早,只有 127 個字符被編碼到計算機里,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱為?ASCII編碼,比如大寫字母 A 的編碼是 65,小寫字母 z 的編碼是122。
  但如果要表示中文字符,顯然一個字節是不夠的,至少需要兩個字節。所以,中國制定了 GB2312 編碼,用來表示中文字符。基于同樣的原因,各個國家都制定了自己的編碼規則 。這樣就會出現一個問題,即在多語言混合的文本中,不同的編碼會出現沖突,導致亂碼出現 。
  為了解決這個問題,Unicode 編碼應運而生,它把所有的語言都統一到一套編碼中,采用 2 個字節表示一個字符,即最多可以表示 65535 個字符,這樣基本上可以覆蓋世界上常用的文字,如果要表示更多的文字,也可以采用 4 個字節進行編碼,這是一種通用的編碼規范 。
  因此,JavaScript 中的字符也采用 Unicode 來編碼 ,也就是說,JavaScript 中的英文字符和中文字符都會占用 2 個字節的空間大小 ,這種多字節字符,通常被稱為寬字符。
<br>
## **2、基本包裝類型**
  在 JavaScript 中,字符串是基本數據類型,本身不存任何操作方法 。為了方便的對字符串進行操作,ECMAScript 提供了一個基本包裝類型:String 對象 。它是一種特殊的引用類型,JS引擎每當讀取一個字符串的時候,就會在內部創建一個對應的 String 對象,該對象提供了很多操作字符的方法,這就是為什么能對字符串調用方法的原因 。
```
12var name ='JavaScript';
var value = name.substr(2,1);
```
  當第二行代碼訪問變量 str 時,訪問過程處于一種讀取模式,也就是要從內存中讀取這個字符串的值。而在讀取模式中訪問字符串時,引擎內部會自動完成下列處理:
* 創建 String 類型的一個實例
* 在實例上調用指定的方法
* 銷毀這個實例
  用偽代碼形象的模擬以上三個步驟:
```
var obj =new String('JavaScript');
var value = obj.substr(2,1);
name =null;
```
  可以看出,基本包裝類型是一種特殊的引用類型。它和普通引用類型有一個很重要的區別,就是對象的生存期不同 。使用 new 操作符創建的引用類型的實例,在執行流離開當前作用域之前都一直保存在內存中。而自動創建的基本包裝類型的對象,則只存在于一行代碼的執行瞬間,然后立即被銷毀。在 JavaScript 中,類似的基本包裝類型還有 Number、Boolean 對象 。
<br>
## **3、常用操作方法**
作為字符串的基本包裝類型,String 對象提供了以下幾類方法,用以操作字符串:
* 字符操作:charAt,charCodeAt,fromCharCode
* 字符串提取:substr,substring ,slice
* 位置索引:indexOf ,lastIndexOf
* 大小寫轉換:toLowerCase,toUpperCase
* 模式匹配:match,search,replace,split
* 其他操作:concat,trim,localeCompare
  charCodeAt 的作用是獲取字符的 Unicode 編碼,俗稱 “Unicode 碼點”。fromCharCode 是 String 對象上的靜態方法,作用是根據 Unicode 編碼返回對應的字符。
```
var a ='a';
// 獲取Unicode編碼
var code = a.charCodeAt(0);
// 97// 根據Unicode編碼獲取字符
String.fromCharCode(code); // a
```
  通過 charCodeAt 獲取字符的 Unicode 編碼,然后再把這個編碼轉化成二進制,就可以得到該字符的二進制表示。
```
var a ='a';
var code = a.charCodeAt(0);// 97
code.toString(2);// 1100001
```
  對于字符串的提取操作,有三個相類似的方法,分別如下:
```
substr(start [, length])
substring(start [, end])
slice(start [, end])
```
  從定義上看,substring 和 slice 是同類的,參數都是字符串的某個 start 位置到某個 end 位置(但 end 位置的字符不包括在結果中);而 substr 則是字符串的某個 start 位置起,數 length 個長度的字符才結束。二者的共性是:從 start 開始,如果沒有第 2 個參數,都是直到字符串末尾。
  substring 和 slice 的區別則是:slice 可以接受 “負數”,表示從字符串尾部開始計數; 而 substring 則把負數或其它無效的數當作 0。
```
'hello world!'.slice(-6, -1)// 'world'
'hello world!'.substring("abc", 5)// 'hello'
```
  substr 的 start 也可接受負數,也表示從字符串尾部計數,這點和 slice 相同;但 substr 的 length 則不能小于 1,否則返回空字符串。
```
'hello world!'.substr(-6, 5)// 'world'
'hello world!'.substr(0, -1)// ''