前面的話
javascript沒有表示單個字符的字符型,只有字符串String類型,字符型相當于僅包含一個字符的字符串
字符串String是javascript基本數據類型,同時javascript也支持String對象,它是一個原始值的包裝對象。在需要時,javascript會自動在原始形式和對象形式之間轉換。本文將介紹字符串String原始類型及String包裝對象
定義
字符串String類型是由引號括起來的一組由16位Unicode字符組成的字符序列
字符串類型常被用于表示文本數據,此時字符串中的每個元素都被視為一個代碼點。每個元素都被認為占有此序列中的一個位置,用非負數值索引這些位置。首字符從位置0開始,第二個字符在位置1,依次類推
字符串的長度即其中元素的個數。空字符串長度為零,因而不包含任何元素

Unicode編碼
javascript采用UTF-16編碼的Unicode字符集,javascript字符串是由一組無符號的16位值組成的序列。最常用的Unicode字符都是通過16位的內碼表示,并代表字符串中的單個字符
[注意]最常用的Unicode字符屬于“基本多語種平面”(Basic Multilingual Plane BMP),也稱為“零斷面”(plan 0), 是Unicode中的一個編碼區段,編碼介于U+0000——U+FFFF之間
所有字符都可以寫成'\uxxxx'的形式,其中xxxx代表該字符的Unicode編碼。比如,\u00A9代表版權符號
var s = '\u00A9'; s // "©"
那些不能表示為16位的Unicode字符(U+10000到U+10FFFF之間的字符,長度為32位(即4個字節),而且前兩個字節在0xD800到0xDBFF之間,后兩個字節在0xDC00到0xDFFF之間),則遵循UTF-16編碼規則——用兩個16位值組成的一個序列(亦稱做“代理項對”)表示。這意味著一個長度為2的javascript字符串(兩個16位值)有可能表示一個Unicode字符
舉例來說,U+1D306對應的字符"𝌆",寫成UTF-16就是0xD834 0xDF06。瀏覽器會正確將這四個字節識別為一個字符,但是javascript內部的字符長度總是固定為16位,會把這四個字節視為兩個字符
var s = '\uD834\uDF06'; s // "𝌆" s.length // 2
引號
字符串String是由雙引號(")或單引號(')聲明的。而Java則是用雙引號聲明字符串,用單引號聲明字符。由于ECMAScript 沒有字符類型,所以可使用這兩種表示法中的任何一種,但左右引號必須匹配
//正確 var sColor1 = "red"; var sColor2 = 'red'; //錯誤 var sColor1 = "red'; var sColor2 = 'red";
由單引號定界的字符串中可以包含雙引號,由雙引號定界的字符串也可以包含單引號
'key = "value"' "It's a long journey"
javascript代碼可能會夾雜HTML代碼的字符串,HTML代碼也會夾雜javascript代碼。因此,最好在javascript和HTML代碼中各自使用獨自的引號風格
javascript中使用單引號表示字符串,在HTML事件處理程序中使用雙引號表示字符串
<button onclick = "alert('thanks')">click me</button>
反斜線
如果想在單引號定界的字符串中使用單引號,或在雙引號定界的字符串中使用雙引號,則需要使用反斜線(\)
常見情況是英文縮寫和所有格寫法的撇號和單引號是同一個字符,所以這時必須使用反斜線(\)來轉義撇號
'Wouldn\'t you prefer this book?' //"Wouldn't you prefer this book?" 'Did she say \'Hello\'?' //"Did she say 'Hello'?" "Did she say \"Hello\"?" //"Did she say "Hello"?"
多行字符
字符串默認只能寫在一行內,分成多行將會報錯
//報錯 Uncaught SyntaxError: Invalid or unexpected token 'a b c';
在ECMAScript3中,字符串必須寫在一行中
在ECMAScript5中,字符串可以拆分成數行,每行必須以反斜線(\)結束
如果希望在字符串直接量中另起一行,可以使用轉義字符\n
//"onelongline" 'one\ long\ line' /*"two lines"*/ 'two\nlines'
轉義字符
在javascript字符串,反斜線(\)有著特殊的用途,反斜線符號后加一個字符,就不表示它們的字面含義,用來表示一些特殊字符,稱為轉義字符
\0 空字節 \n 換行 \t 制表 \b 空格 \r 回車 \f 進紙 \\ 斜杠 \' 單引號 \" 雙引號 \xnn 以十六進制nn表示一個字符(n為0-f),如\x41表示'A' \unnnn 以十六進制nnnn表示一個Unicode字符(n為0-f),如\u03a3表示希臘字符ε
如果在非特殊字符前面使用反斜杠,則反斜杠會被省略
'\a' // "a"
如果字符串需要包含反斜杠,則反斜杠前面需要再加一個反斜杠,用來對自身轉義
"Prev \\ Next" // "Prev \ Next"
特點
javascript中的字符串是不可變的。一旦字符串被創建,就永遠無法改變它。要改變某個變量保存的字符串,首先要銷毀原來的字符串,然后再用另一個包含新值的字符串填充該變量
可以通過+運算符連接其他字符串來創建一個新字符串
var lang = "java"; lang = lang + "script"; //'javascript'
以上代碼的實際過程是:首先創建一個能夠容納10個字符的新字符串,然后在這個字符串中填充'java'和'script',最后一步是銷毀原來的字符串'java'和'script',因為這兩個字符串已經沒用了
這個過程在后臺發生,也是在某些舊版本瀏覽器(IE6)拼接字符串速度慢的原因,但瀏覽器后面版本已經解決了這個低效率問題
轉字符串
把一個值轉換為字符串有兩種方式,toString()和String()
[注意]可以使用空字符串"" + 某個值,將該值轉換為字符串
toString()
第一種是使用幾乎每個值都有的toString()方法,這個方法返回相應值的字符串表現
[注意]undefined和null沒有該方法
undefined.toString();//錯誤 null.toString();//錯誤 true.toString();//'true' false.toString();//'false' 'abc'.toString();//'abc' 1.23.toString();//'1.23' ({}).toString();//[object Object] [1,2,3,4].toString();//'1,2,3,4' (new Date()).toString();//"Sun Jun 05 2016 10:04:53 GMT+0800 (中國標準時間)" /ab/i.toString();//'/ab/i'
String()
在不知道要轉換的值是不是undefined或null時,可以使用轉型函數String()
轉型函數String()遵循下列規則:
【1】如果值是null,則返回'null';如果值是undefined,則返回'undefined'
【2】如果值不是null或undefined,則調用toString()方法并返回原始類型值
【3】若使用toString()方法返回的是對象,則再調用valueOf()方法返回原始類型值,若使用valueOf()方法返回的是對象,會報錯
// "3" String({toString: function () { return 3; } }) // "[object Object]" String({valueOf: function () { return 2; } }) // "3" String({ valueOf: function () { return 2; }, toString: function () { return 3; } })
參考資料
【1】 ES5/類型 https://www.w3.org/html/ig/zh/wiki/ES5/types
【2】 阮一峰Javascript標準參考教程——基本語法之字符串 http://javascript.ruanyifeng.com
【3】 W3School-Javascript高級教程——ECMAScript原始類型 http://www.w3school.com.cn
【4】《javascript權威指南(第6版)》第3章 類型、值和變量
【5】《javascript高級程序設計(第3版)》第3章 基本概念
【6】《javascript語言精粹(修訂版)》第2章 語法
【7】《javascript DOM編程藝術(第2版)》第2章 Javascript語法
文章列表