文章出處

前面的話

  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語法


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()