[TOC]
## 概述
### 定義
字符串就是若干個排在一起的字符,放在單引號或雙引號之中。
~~~
'abc'
"abc"
~~~
單引號字符串的內部,可以使用雙引號;雙引號字符串的內部,可以使用單引號。
~~~
'key="value"'
"It's a long journey"
~~~
如果要在單引號字符串的內部,使用單引號(或者在雙引號字符串的內部,使用雙引號),就必須在內部的單引號(或者雙引號)前面加上反斜杠,用來轉義。
~~~
'Did she say \'Hello\'?'
"Did she say \"Hello\"?"
~~~
字符串默認只能寫在一行內,分成多行將會報錯。
~~~
'a
b
c'
// SyntaxError: Unexpected token ILLEGAL
~~~
上面代碼將一個字符串分成三行,JavaScript就會報錯。
如果長字符串必須分成多行,可以在每一行的尾部使用反斜杠。
~~~
var longString = "Long \
long \
long \
string";
longString
// "Long long long string"
~~~
上面代碼表示,加了反斜杠以后,原來寫在一行的字符串,可以分成多行,效果與寫在同一行完全一樣。
但是,這種寫法有兩個注意點,首先,它是ECMAScript 5新添加的,老式瀏覽器(如IE 8)不支持,其次,反斜杠的后面必須是換行符,而不能有其他字符(比如空格),否則會報錯。
連接運算符(+)可以連接多個單行字符串,用來模擬多行字符串。
~~~
var longString = "Long " +
"long " +
"long " +
"string";
~~~
另外,有一種利用多行注釋,生成多行字符串的變通方法。
~~~
(function () { /*
line 1
line 2
line 3
*/}).toString().split('\n').slice(1,-1).join('\n')
// "line 1
// line 2
// line 3"
~~~
### 轉義
反斜杠在字符串內有特殊含義,用來表示一些特殊字符,所以又稱為轉義符。
需要用反斜杠轉義的特殊字符,主要有下面這些:
* \0 代表沒有內容的字符(\u0000)
* \b 后退鍵(\u0008)
* \f 換頁符(\u000C)
* \n 換行符(\u000A)
* \r 回車鍵(\u000D)
* \t 制表符(\u0009)
* \v 垂直制表符(\u000B)
* \' 單引號(\u0027)
* \" 雙引號(\u0022)
* \\ 反斜杠(\u005C)
* \XXX 用三位八進制數(0到377)代表一些特殊符號,比如\251表示版權符號。
* \xXX 用兩位十六進制數(00到FF)代表一些特殊符號,比如\xA9表示版權符號。
* \uXXXX 用四位十六進制的Unicode編號代表某個字符,比如\u00A9表示版權符號。
下面是最后三種字符的特殊寫法的例子。
~~~
"\251" // "?"
"\xA9" // "?"
"\u00A9" // "?"
~~~
如果非特殊字符前面使用反斜杠,則反斜杠會被省略。
~~~
"\a"
// "a"
~~~
上面代碼表示a是一個正常字符,前面加反斜杠沒有特殊含義,則反斜杠會被自動省略。
如果字符串的正常內容之中,需要包含反斜杠,則反斜杠前需要再加一個反斜杠,用來對自身轉義。
~~~
"Prev \\ Next"
// "Prev \ Next"
~~~
### 字符串與數組
字符串可以被視為字符數組,因此可以使用數組的方括號運算符,用來返回某個位置的字符(從0開始)。
~~~
var s = 'hello';
s[0] // "h"
s[1] // "e"
s[4] // "o"
// 也可以直接對字符串使用方括號運算符
'hello'[1] // "e"
~~~
如果方括號中的數字超過字符串的范圍,或者方括號中根本不是數字,則返回undefined。
~~~
'abc'[3] // undefined
'abc'[-1] // undefined
'abc'["x"] // undefined
~~~
但是,字符串與數組的相似性僅此而已。實際上,字符串是類似數組的對象,且無法改變字符串之中的單個字符。
~~~
var s = 'hello';
delete s[0];
s // "hello"
s[1] = 'a';
s // "hello"
s[5] = '!';
s // "hello"
~~~
上面代碼表示,字符串內部的單個字符無法改變和增刪,這些操作會默默地失敗。
length屬性返回字符串的長度,該屬性也是無法改變的。
~~~
var s = 'hello';
s.length // 5
s.length = 3;
s.length // 5
s.length = 7;
s.length // 5
~~~
上面代碼表示字符串的length屬性無法改變,但是不會報錯。
字符串也無法添加新屬性。
~~~
var s = "Hello World";
s.x = 123;
s.x // undefined
~~~
上面代碼為字符串s添加了一個x屬性,結果無效,總是返回undefined。
上面這些行為的原因是,在JavaScript內部,變量s其實指向字符串“Hello World”的地址,而“Hello World”本身是一個常量,所以無法改變它,既不能新增,也不能刪除。另一方面,當一個字符串被調用屬性時,它會自動轉為String對象的實例(參見《標準庫》一章),調用結束后,該對象自動銷毀。這意味著,下一次調用字符串的屬性時,實際是調用一個臨時生成的新對象,而不是上一次調用時生成的那個對象,所以取不到賦值在上一個對象的屬性。如果想要為字符串添加屬性,只有在它的原型對象String.prototype上定義(參見《面向對象編程》一章)。
## 字符集
JavaScript使用Unicode字符集,也就是說在JavaScript內部,所有字符都用Unicode表示。ECMAScript 3要求使用Unicode 2.1或以上版本,ECMAScript 5則要求使用Unicode 3及以上版本。
不僅JavaScript內部使用Unicode儲存字符,而且還可以直接在程序中使用Unicode,所有字符都可以寫成"\uxxxx"的形式,其中xxxx代表該字符的Unicode編碼。比如,\u00A9代表版權符號。
~~~
var s = '\u00A9';
s // "?"
~~~
每個字符在JavaScript內部都是以16位(即2個字節)的UTF-16格式儲存。也就是說,JavaScript的單位字符長度固定為2個字節。
但是需要注意的是,UTF-16有兩種長度:對于U+0000到U+FFFF之間的字符,長度為16位(即2個字節);對于U+10000到U+10FFFF之間的字符,長度為32位(即4個字節),而且前兩個字節在0xD800到0xDBFF之間,后兩個字節在0xDC00到0xDFFF之間。舉例來說,U+1D306對應的字符為
- 第一章 導論
- 1.1 前言
- 1.2 為什么學習JavaScript?
- 1.3 JavaScript的歷史
- 第二章 基本語法
- 2.1 語法概述
- 2.2 數值
- 2.3 字符串
- 2.4 對象
- 2.5 數組
- 2.6 函數
- 2.7 運算符
- 2.8 數據類型轉換
- 2.9 錯誤處理機制
- 2.10 JavaScript 編程風格
- 第三章 標準庫
- 3.1 Object對象
- 3.2 Array 對象
- 3.3 包裝對象和Boolean對象
- 3.4 Number對象
- 3.5 String對象
- 3.6 Math對象
- 3.7 Date對象
- 3.8 RegExp對象
- 3.9 JSON對象
- 3.10 ArrayBuffer:類型化數組
- 第四章 面向對象編程
- 4.1 概述
- 4.2 封裝
- 4.3 繼承
- 4.4 模塊化編程
- 第五章 DOM
- 5.1 Node節點
- 5.2 document節點
- 5.3 Element對象
- 5.4 Text節點和DocumentFragment節點
- 5.5 Event對象
- 5.6 CSS操作
- 5.7 Mutation Observer
- 第六章 瀏覽器對象
- 6.1 瀏覽器的JavaScript引擎
- 6.2 定時器
- 6.3 window對象
- 6.4 history對象
- 6.5 Ajax
- 6.6 同域限制和window.postMessage方法
- 6.7 Web Storage:瀏覽器端數據儲存機制
- 6.8 IndexedDB:瀏覽器端數據庫
- 6.9 Web Notifications API
- 6.10 Performance API
- 6.11 移動設備API
- 第七章 HTML網頁的API
- 7.1 HTML網頁元素
- 7.2 Canvas API
- 7.3 SVG 圖像
- 7.4 表單
- 7.5 文件和二進制數據的操作
- 7.6 Web Worker
- 7.7 SSE:服務器發送事件
- 7.8 Page Visibility API
- 7.9 Fullscreen API:全屏操作
- 7.10 Web Speech
- 7.11 requestAnimationFrame
- 7.12 WebSocket
- 7.13 WebRTC
- 7.14 Web Components
- 第八章 開發工具
- 8.1 console對象
- 8.2 PhantomJS
- 8.3 Bower:客戶端庫管理工具
- 8.4 Grunt:任務自動管理工具
- 8.5 Gulp:任務自動管理工具
- 8.6 Browserify:瀏覽器加載Node.js模塊
- 8.7 RequireJS和AMD規范
- 8.8 Source Map
- 8.9 JavaScript 程序測試
- 第九章 JavaScript高級語法
- 9.1 Promise對象
- 9.2 有限狀態機
- 9.3 MVC框架與Backbone.js
- 9.4 嚴格模式
- 9.5 ECMAScript 6 介紹
- 附錄
- 10.1 JavaScript API列表
- 草稿一:函數庫
- 11.1 Underscore.js
- 11.2 Modernizr
- 11.3 Datejs
- 11.4 D3.js
- 11.5 設計模式
- 11.6 排序算法
- 草稿二:jQuery
- 12.1 jQuery概述
- 12.2 jQuery工具方法
- 12.3 jQuery插件開發
- 12.4 jQuery.Deferred對象
- 12.5 如何做到 jQuery-free?
- 草稿三:Node.js
- 13.1 Node.js 概述
- 13.2 CommonJS規范
- 13.3 package.json文件
- 13.4 npm模塊管理器
- 13.5 fs 模塊
- 13.6 Path模塊
- 13.7 process對象
- 13.8 Buffer對象
- 13.9 Events模塊
- 13.10 stream接口
- 13.11 Child Process模塊
- 13.12 Http模塊
- 13.13 assert 模塊
- 13.14 Cluster模塊
- 13.15 os模塊
- 13.16 Net模塊和DNS模塊
- 13.17 Express框架
- 13.18 Koa 框架