亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

解析JavaScript中的字符串類型與字符編碼支持

2019-11-20 09:36:24
字體:
來源:轉載
供稿:網友

定義
字符串就是零個或多個排在一起的字符,放在單引號或雙引號之中。

'abc'"abc"
單引號字符串的內部,可以使用雙引號。雙引號字符串的內部,可以使用單引號。
'key = "value"'"It's a long journey"

上面兩個都是合法的字符串。

如果要在單引號字符串的內部,使用單引號(或者在雙引號字符串的內部,使用雙引號),就必須在內部的單引號(或者雙引號)前面加上反斜杠,用來轉義。

'Did she say /'Hello/'?'// "Did she say 'Hello'?""Did she say /"Hello/"?"http:// "Did she say "Hello"?"

由于HTML語言的屬性值使用雙引號,所以很多項目約定JavaScript語言的字符串只使用單引號,本教程就遵守這個約定。當然,只使用雙引號也完全可以。重要的是,堅持使用一種風格,不要兩種風格混合。

字符串默認只能寫在一行內,分成多行將會報錯。

'abc'// SyntaxError: Unexpected token ILLEGAL

上面代碼將一個字符串分成三行,JavaScript就會報錯。

如果長字符串必須分成多行,可以在每一行的尾部使用反斜杠。

var longString = "Long /long /long /string";longString// "Long long long string"

上面代碼表示,加了反斜杠以后,原來寫在一行的字符串,可以分成多行書寫。但是,輸出的時候還是單行,效果與寫在同一行完全一樣。注意,反斜杠的后面必須是換行符,而不能有其他字符(比如空格),否則會報錯。

連接運算符(+)可以連接多個單行字符串,將長字符串拆成多行書寫,輸出的時候也是單行。

var longString = 'Long ' + 'long ' + 'long ' + 'string';

如果想輸出多行字符串,有一種利用多行注釋的變通方法。

(function () { /*line 1line 2line 3*/}).toString().split('/n').slice(1, -1).join('/n')// "line 1// line 2// line 3"

上面的例子中,輸出的字符串就是多行。

轉義
反斜杠(/)在字符串內有特殊含義,用來表示一些特殊字符,所以又稱為轉義符。

需要用反斜杠轉義的特殊字符,主要有下面這些:

  • /0 null(/u0000)
  • /b 后退鍵(/u0008)
  • /f 換頁符(/u000C)
  • /n 換行符(/u000A)
  • /r 回車鍵(/u000D)
  • /t 制表符(/u0009)
  • /v 垂直制表符(/u000B)
  • /' 單引號(/u0027)
  • /" 雙引號(/u0022)
  • / 反斜杠(/u005C)

上面這些字符前面加上反斜杠,都表示特殊含義。

console.log('1/n2')// 1// 2

上面代碼中,/n表示換行,輸出的時候就分成了兩行。

反斜杠還有三種特殊用法。

(1)/HHH

反斜杠后面緊跟三個八進制數(000到377),代表一個字符。HHH對應該字符的Unicode碼點,比如/251表示版權符號。顯然,這種方法只能輸出256種字符。

(2)/xHH

/x后面緊跟兩個十六進制數(00到FF),代表一個字符。HH對應該字符的Unicode碼點,比如/xA9表示版權符號。這種方法也只能輸出256種字符。

(3)/uXXXX

/u后面緊跟四個十六進制數(0000到FFFF),代表一個字符。HHHH對應該字符的Unicode碼點,比如/u00A9表示版權符號。

下面是這三種字符特殊寫法的例子。

'/251' // "©"'/xA9' // "©"'/u00A9' // "©"'/172' === 'z' // true'/x7A' === 'z' // true'/u007A' === 'z' // true

如果在非特殊字符前面使用反斜杠,則反斜杠會被省略。

'/a'// "a"

上面代碼中,a是一個正常字符,前面加反斜杠沒有特殊含義,反斜杠會被自動省略。

如果字符串的正常內容之中,需要包含反斜杠,則反斜杠前面需要再加一個反斜杠,用來對自身轉義。

"Prev // Next"http:// "Prev / Next"

字符串與數組
字符串可以被視為字符數組,因此可以使用數組的方括號運算符,用來返回某個位置的字符(位置編號從0開始)。

var s = 'hello';s[0] // "h"s[1] // "e"s[4] // "o"http:// 直接對字符串使用方括號運算符'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屬性
length屬性返回字符串的長度,該屬性也是無法改變的。

var s = 'hello';s.length // 5s.length = 3;s.length // 5s.length = 7;s.length // 5

上面代碼表示字符串的length屬性無法改變,但是不會報錯。

字符集
JavaScript使用Unicode字符集,也就是說在JavaScript內部,所有字符都用Unicode表示。

不僅JavaScript內部使用Unicode儲存字符,而且還可以直接在程序中使用Unicode,所有字符都可以寫成”/uxxxx”的形式,其中xxxx代表該字符的Unicode編碼。比如,/u00A9代表版權符號。

var s = '/u00A9';s // "©"

每個字符在JavaScript內部都是以16位(即2個字節)的UTF-16格式儲存。也就是說,JavaScript的單位字符長度固定為16位長度,即2個字節。

但是,UTF-16有兩種長度:對于U+0000到U+FFFF之間的字符,長度為16位(即2個字節);對于U+10000到U+10FFFF之間的字符,長度為32位(即4個字節),而且前兩個字節在0xD800到0xDBFF之間,后兩個字節在0xDC00到0xDFFF之間。舉例來說,U+1D306對應的字符為𝌆,它寫成UTF-16就是0xD834 0xDF06。瀏覽器會正確將這四個字節識別為一個字符,但是JavaScript內部的字符長度總是固定為16位,會把這四個字節視為兩個字符。

var s = '/uD834/uDF06';s // "𝌆"s.length // 2/^.$/.test(s) // falses.charAt(0) // ""s.charAt(1) // ""s.charCodeAt(0) // 55348s.charCodeAt(1) // 57094

上面代碼說明,對于于U+10000到U+10FFFF之間的字符,JavaScript總是視為兩個字符(字符的length屬性為2),用來匹配單個字符的正則表達式會失敗(JavaScript認為這里不止一個字符),charAt方法無法返回單個字符,charCodeAt方法返回每個字節對應的十進制值。

所以處理的時候,必須把這一點考慮在內。對于4個字節的Unicode字符,假定C是字符的Unicode編號,H是前兩個字節,L是后兩個字節,則它們之間的換算關系如下。

// 將大于U+FFFF的字符,從Unicode轉為UTF-16H = Math.floor((C - 0x10000) / 0x400) + 0xD800L = (C - 0x10000) % 0x400 + 0xDC00// 將大于U+FFFF的字符,從UTF-16轉為UnicodeC = (H - 0xD800) * 0x400 + L - 0xDC00 + 0x10000

下面的正則表達式可以識別所有UTF-16字符。

([/0-/uD7FF/uE000-/uFFFF]|[/uD800-/uDBFF][/uDC00-/uDFFF])

由于JavaScript引擎(嚴格說是ES5規格)不能自動識別輔助平面(編號大于0xFFFF)的Unicode字符,導致所有字符串處理函數遇到這類字符,都會產生錯誤的結果。如果要完成字符串相關操作,就必須判斷字符是否落在0xD800到0xDFFF這個區間。

下面是能夠正確處理字符串遍歷的函數。

function getSymbols(string) { var length = string.length; var index = -1; var output = []; var character; var charCode; while (++index < length) {  character = string.charAt(index);  charCode = character.charCodeAt(0);  if (charCode >= 0xD800 && charCode <= 0xDBFF) {   output.push(character + string.charAt(++index));  } else {   output.push(character);  } } return output;}var symbols = getSymbols('𝌆');symbols.forEach(function(symbol) { // ...});

替換(String.prototype.replace)、截取子字符串(String.prototype.substring, String.prototype.slice)等其他字符串操作,都必須做類似的處理。

Base64轉碼
Base64是一種編碼方法,可以將任意字符轉成可打印字符。使用這種編碼方法,主要不是為了加密,而是為了不出現特殊字符,簡化程序的處理。

JavaScript原生提供兩個Base64相關方法。

  • btoa():字符串或二進制值轉為Base64編碼
  • atob():Base64編碼轉為原來的編碼
var string = 'Hello World!';btoa(string) // "SGVsbG8gV29ybGQh"atob('SGVsbG8gV29ybGQh') // "Hello World!"這兩個方法不適合非ASCII碼的字符,會報錯。btoa('你好')// Uncaught DOMException: The string to be encoded contains characters outside of the Latin1 range.要將非ASCII碼字符轉為Base64編碼,必須中間插入一個轉碼環節,再使用這兩個方法。function b64Encode(str) { return btoa(encodeURIComponent(str));}function b64Decode(str) { return decodeURIComponent(atob(str));}b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE"b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久99青青精品免费观看| 在线看国产精品| 欧美性猛交xxxx黑人猛交| 国产精品男人爽免费视频1| 欧美激情一区二区三区久久久| 国产精品视频大全| 伦理中文字幕亚洲| 欲色天天网综合久久| 久久精品视频99| 日韩精品中文在线观看| 亚洲va欧美va国产综合久久| 久久精品视频免费播放| 91美女高潮出水| 亚洲tv在线观看| 日韩欧美高清在线视频| 欧美激情二区三区| 国产日韩欧美视频| 欧美激情精品久久久久久大尺度| 日韩视频精品在线| 欧美性猛交xxxx乱大交3| 国精产品一区一区三区有限在线| 亚洲激情国产精品| 91精品国产综合久久香蕉922| 久久久国产视频| 久久久综合免费视频| 亚洲福利小视频| 亚洲高清不卡av| 国产精品视频久久久久| xxx一区二区| 中文字幕一精品亚洲无线一区| 97久久精品人人澡人人爽缅北| 亚洲国产精品成人一区二区| 色综合久综合久久综合久鬼88| 久久精品福利视频| 成人在线中文字幕| 蜜月aⅴ免费一区二区三区| 国产一区视频在线播放| 午夜剧场成人观在线视频免费观看| 欧美日韩激情视频| 九色91av视频| 日韩欧美在线国产| 精品国产乱码久久久久酒店| 国产精品日韩一区| 国产精品av在线播放| 在线亚洲男人天堂| 777午夜精品福利在线观看| 国产精品自拍小视频| 蜜臀久久99精品久久久久久宅男| 亚洲人成网站777色婷婷| 欧美人与物videos| 欧美性jizz18性欧美| 成人在线小视频| 国产精品免费久久久| 亚洲毛片在线观看| 97精品久久久中文字幕免费| 一区二区欧美久久| 国产亚洲精品一区二区| 青青在线视频一区二区三区| 美女av一区二区| 视频在线观看一区二区| 日韩av电影手机在线观看| 欧美日韩午夜剧场| 欧美午夜视频在线观看| 成人国产精品久久久| 色综合天天狠天天透天天伊人| 91久热免费在线视频| 国产z一区二区三区| 国产一区二区三区视频免费| 日韩欧美在线字幕| 日韩精品亚洲精品| 国产精品69精品一区二区三区| 亚洲国模精品一区| 91免费在线视频网站| 中文字幕亚洲一区二区三区五十路| 亚洲人成在线观看网站高清| 国产亚洲精品高潮| 91精品国产自产在线观看永久| 欧美成人精品h版在线观看| 亚洲成色777777在线观看影院| 久久人人爽人人| 成人性生交大片免费观看嘿嘿视频| 久久精品国产一区二区三区| 亚洲аv电影天堂网| 亚洲精品电影网| 欧美成年人视频网站欧美| 欧美视频在线看| 精品亚洲国产视频| 久久视频精品在线| 久久久之久亚州精品露出| 亚洲第一福利网| 色无极亚洲影院| 国产精品自产拍在线观看| 亚洲精品欧美日韩| 国产亚洲一区二区精品| 欧美日韩国产成人高清视频| 欧美激情在线狂野欧美精品| 日韩专区中文字幕| 欧美精品一二区| 欧美华人在线视频| 综合网中文字幕| 日韩在线观看你懂的| 欧美黄色小视频| 欧美午夜女人视频在线| 91久久久国产精品| 久久精品国产电影| 欧美一级淫片aaaaaaa视频| 2019国产精品自在线拍国产不卡| 成人久久久久久久| 国产成人精品久久二区二区| 成人亚洲综合色就1024| 久久久久久香蕉网| 一区二区欧美在线| 欧美一级视频免费在线观看| 欧美一区二区影院| 最新91在线视频| 久久精品视频中文字幕| 久久在精品线影院精品国产| 精品亚洲一区二区三区| 国内精品久久久久久影视8| 国产一区二区美女视频| 国产精品黄色影片导航在线观看| 中文字幕精品www乱入免费视频| 久久人人97超碰精品888| 中文字幕不卡在线视频极品| 久久色免费在线视频| 国产精品嫩草影院久久久| 亚洲欧美制服另类日韩| 欧美在线一区二区三区四| 久久久久一本一区二区青青蜜月| 美女福利精品视频| 亚洲国产精品久久久久秋霞蜜臀| …久久精品99久久香蕉国产| 情事1991在线| 日韩精品在线免费观看视频| 97国产精品视频人人做人人爱| 亚洲欧美激情四射在线日| 日韩中文有码在线视频| 亚洲va码欧洲m码| www.xxxx欧美| 91精品国产91久久| 不卡av电影在线观看| 久久全球大尺度高清视频| 欧美性一区二区三区| 中文字幕免费国产精品| 高清一区二区三区四区五区| 亚洲激情小视频| 国内伊人久久久久久网站视频| 欧美性猛交xxxxx免费看| 国产自产女人91一区在线观看| 久久久久久久一区二区三区| 欧美乱人伦中文字幕在线| 亚洲美女福利视频网站| 欧美在线一级va免费观看| 亚洲自拍欧美另类| 91久久精品国产91久久| 69久久夜色精品国产7777| 美女av一区二区| 久久亚洲春色中文字幕| 欧美国产日韩一区二区| 亚洲欧美日韩第一区| 久久99精品久久久久久琪琪| 欧美亚洲成人免费| 久久久免费精品视频| 久久久国产精品亚洲一区|