1. 字符串的Unicode表示方法
javaScript允許采用\uxxxx形式表示字符串, xxxx表示字符的unicode碼點(diǎn)
這種表示法只限于\u0000 --\uFFFF之間的字符, 超出這個(gè)范圍必須使用雙字節(jié)
'\u0061' // a
'\uD847\uDFB7' // '吉'
es6對(duì)超過碼點(diǎn)進(jìn)行的改進(jìn),只需將碼點(diǎn)放入大括號(hào)就能正確讀解該字符
'\u{1F680}' === '\uD83D\uDE80'
// true
有了這之后JavaScript有六種方法表示一個(gè)字符
'\z' === 'z' // true
'\172' === 'z' // true
'\x7A' === 'z' // true
'\u007A' === 'z' // true
'\u{7A}' === 'z' // true
2. codePoinAt()
JavaScript內(nèi)部,字符已UTF-16的格式存儲(chǔ),每個(gè)字符固定為2個(gè)字節(jié),.對(duì)于那些需要4個(gè)字節(jié)存儲(chǔ)的的字符(unicode碼點(diǎn)大于0xFFFF),會(huì)認(rèn)為他們是兩個(gè)字符 。
codPoinAt能夠正確處理4個(gè)字節(jié)存儲(chǔ)的字符返回一個(gè)字符的碼點(diǎn)
var s = '吉';
s.length // 2
s.chart(0) // "
s.chart(1) // ''
s.charCodeAt(0) // 55362
s.charCodeAt(1) // 57271
s.codePointAt(0) //134071
s.codePoinAt(1) //57271
總之,codePointAt方法會(huì)正確返回 32 位的 UTF-16 字符的碼點(diǎn)。對(duì)于那些兩個(gè)字節(jié)儲(chǔ)存的常規(guī)字符,它的返回結(jié)果與charCodeAt方法相同。
codePointAt方法返回的是碼點(diǎn)的十進(jìn)制值,如果想要十六進(jìn)制的值,可以使用toString方法轉(zhuǎn)換一下。
let s = '??a';
s.codePointAt(0).toString(16) // "20bb7"
s.codePointAt(2).toString(16) // "61"
codePointAt方法是測(cè)試一個(gè)字符是由兩個(gè)字節(jié)還是四個(gè)字節(jié)組成的最簡(jiǎn)單的方法
3. String.fromCodePoint()
ES5中String.fromcharCode方法用于從碼點(diǎn)返回對(duì)應(yīng)字符,但是不能識(shí)別32位的UTF-16字符(unicode編號(hào)大于0xFFFF).
String.fromCharCode(0x20BB7)
// "?"
ES6 提供了String.fromCodePoin放大可識(shí)別大于0xFFFF的字符 作用上與codePionAt相反
String.fromCodePoint(0x20BB7)
// "??"
String.fromCodePoint(0x78, 0x1f680, 0x79) === 'x\uD83D\uDE80y'
// true
4. 字符串遍歷接口
ES6 為字符串添加了遍歷器接口,使得字符串可以被for...of循環(huán)遍歷。
for (let code in 'foo') {
console.log(code) // 'f' 'o' 'o'
}
5. at()
ES5 提供了chartAt方法,返回字符串的給定位置的字符 該方法不能識(shí)別碼點(diǎn)大于0xFFFF的字符
目前,有一個(gè)提案,提出字符串實(shí)例的at方法,可以識(shí)別 Unicode 編號(hào)大于0xFFFF的字符,返回正確的字符。
6. normalize()
normalize方法可以接受一個(gè)參數(shù)來指定normalize的方式,參數(shù)的四個(gè)可選值如下。
-
NFC,默認(rèn)參數(shù),表示“標(biāo)準(zhǔn)等價(jià)合成”(Normalization Form Canonical Composition),返回多個(gè)簡(jiǎn)單字符的合成字符。所謂“標(biāo)準(zhǔn)等價(jià)”指的是視覺和語(yǔ)義上的等價(jià)。 -
NFD,表示“標(biāo)準(zhǔn)等價(jià)分解”(Normalization Form Canonical Decomposition),即在標(biāo)準(zhǔn)等價(jià)的前提下,返回合成字符分解的多個(gè)簡(jiǎn)單字符。 -
NFKC,表示“兼容等價(jià)合成”(Normalization Form Compatibility Composition),返回合成字符。所謂“兼容等價(jià)”指的是語(yǔ)義上存在等價(jià),但視覺上不等價(jià),比如“囍”和“喜喜”。(這只是用來舉例,normalize方法不能識(shí)別中文。) -
NFKD,表示“兼容等價(jià)分解”(Normalization Form Compatibility Decomposition),即在兼容等價(jià)的前提下,返回合成字符分解的多個(gè)簡(jiǎn)單字符。
不過,normalize方法目前不能識(shí)別三個(gè)或三個(gè)以上字符的合成。這種情況下,還是只能使用正則表達(dá)式,通過 Unicode 編號(hào)區(qū)間判斷。
7. includes() , startsWith() , endsWith()
-
includes(): 返回布爾值 , 表示是否找到參數(shù)字符串 -
startsWith(): 返回布爾值 , 表示參數(shù)字符串是否在原字符串頭部 -
endsWith(): 返回布爾值 , 表示參數(shù)字符串是否在原字符串尾部
都支持第二個(gè)參數(shù)表示開始搜索的位置 (endsWith針對(duì)前n個(gè)字符)
let s = 'hello' ;
s.startsWith('h') // true
s.endsWith('o') // true
s.includes('ll' , 0) // true
8. repeat()
repeat() 方法返回一個(gè)新的字符串,表示將原字符串重復(fù)n次
'x'.repeat(3) // 'xxx'
// 參數(shù)如果是小數(shù),會(huì)被取整
'x'.repeat(2.9) // 'xxx'
// 參數(shù)如果是負(fù)數(shù),或者```Infinity```,會(huì)報(bào)錯(cuò)
'x'.repeat(Infinity) // Error
// 0-1之間的小數(shù) 和 NaN 等同于0
// 參數(shù)是字符串則會(huì)先轉(zhuǎn)換成數(shù)字
'na'.repeat('na') // ''
'na'.repea('3') // 'nanana'
9. padStart() , padEnd()
ES8 引入了字符串全長(zhǎng)度補(bǔ)全功能.padStart()補(bǔ)全頭部,padEnd()補(bǔ)全尾部
'x'.padStart(6 , 'abc') // 'abcabx'
'x'.padEnd(6, 'abc') // 'xabcab'
// 第一個(gè)參數(shù)為最小長(zhǎng)度, 第二個(gè)為補(bǔ)全的字符串
// 如果原字符串的長(zhǎng)度 等于或大于指定的最小長(zhǎng)度,則返回原字符串
`xxx`.padStart(2 , 'a') // 'xxx'
// 如果原字符串和補(bǔ)全字符串的長(zhǎng)度之和超過制定最小長(zhǎng)度,則會(huì)截去補(bǔ)全字符串超出的位數(shù)
'xxxxxx'.padEnd(10,'aaaaaaaa') // 'xxxxxxaaaa'
// 如果省略第二個(gè)參數(shù), 默認(rèn)使用空格補(bǔ)全長(zhǎng)度
'a'.padStart(5) // ' a'
常見用途
// padStart的常見用途是為數(shù)值補(bǔ)全指定位數(shù)。下面代碼生成 10 位的數(shù)值字符串
'1'.padStart(10, '0') // "0000000001"
'12'.padStart(10, '0') // "0000000012"
'123456'.padStart(10, '0') // "0000123456"
// 另一個(gè)用途是提示字符串格式。
'12'.padStart(10, 'YYYY-MM-DD') // "YYYY-MM-12"
'09-12'.padStart(10, 'YYYY-MM-DD') // "YYYY-09-12"
10. matchAll()
matchAll方法返回一個(gè)正則表達(dá)式在當(dāng)前字符串的所有匹配
11. 模板字符串
- 模板字符串(template string)是增強(qiáng)版的字符串,用反引號(hào)(`)標(biāo)識(shí)。它可以當(dāng)作普通字符串使用,也可以用來定義多行字符串,或者在字符串中嵌入變量。
// 普通字符串
`In JavaScript `\n` is a line-feed`
// 多行模板字符串
` In JavaScript
is a line-feed `
console.log(`string text line 1
string text line 2`);
// 字符串中嵌入變量
// 模板字符串中嵌入變量,需要將變量名寫在${}之中。
let name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`
- 模板字符串要用反引號(hào)表示, 如果在模板字符串中需要使用反引號(hào) 則需反斜杠轉(zhuǎn)譯
- 模板字符串的空格和換行都是被保留的 如果不想要 可以使用
trim消除
$('#list').html(`
<ul>
<li>first</li>
<li>second</li>
</ul>
`.trim());
- 大括號(hào)內(nèi)部可以放入任意的 JavaScript 表達(dá)式,可以進(jìn)行運(yùn)算,以及引用對(duì)象屬性。
- 模板字符串之中還能調(diào)用函數(shù)。
- 如果大括號(hào)中的值不是字符串,將按照一般的規(guī)則轉(zhuǎn)為字符串。比如,大括號(hào)中是一個(gè)對(duì)象,將默認(rèn)調(diào)用對(duì)象的toString方法。
- 如果模板字符串中的變量沒有聲明,將報(bào)錯(cuò)。
- 模板字符串甚至還能嵌套。
12. [模板編譯] (http://es6.ruanyifeng.com/#docs/string)
13. [標(biāo)簽?zāi)0錧 (http://es6.ruanyifeng.com/#docs/string)
模板字符串的功能,不僅僅是上面這些。它可以緊跟在一個(gè)函數(shù)名后面,該函數(shù)將被調(diào)用來處理這個(gè)模板字符串。這被稱為“標(biāo)簽?zāi)0濉惫δ埽╰agged template)。
14. String.raw()
- String.raw方法,往往用來充當(dāng)模板字符串的處理函數(shù),返回一個(gè)斜杠都被轉(zhuǎn)義(即斜杠前面再加一個(gè)斜杠)的字符串,對(duì)應(yīng)于替換變量后的模板字符串。
String.raw`Hi\n${2+3}!`;
// 返回 "Hi\\n5!"
String.raw`Hi\u000A!`;
// 返回 "Hi\\u000A!"
String.raw`Hi\\n`
// 返回 "Hi\\\\n"
- String.raw方法可以作為處理模板字符串的基本方法,它會(huì)將所有變量替換,而且對(duì)斜杠進(jìn)行轉(zhuǎn)義,方便下一步作為字符串來使用。
- String.raw方法也可以作為正常的函數(shù)使用。這時(shí),它的第一個(gè)參數(shù),應(yīng)該是一個(gè)具有raw屬性的對(duì)象,且raw屬性的值應(yīng)該是一個(gè)數(shù)組。
String.raw({ raw: 'test' }, 0, 1, 2);
// 't0e1s2t'
// 等同于
String.raw({ raw: ['t','e','s','t'] }, 0, 1, 2);
- 作為函數(shù),String.raw的代碼實(shí)現(xiàn)基本如下。
String.raw = function ( String , ...values) {
let output = '' ;
let index
for (index = 0 ;index < values.length ;index++) {
optput += strings.raw[index] + values[index];
}
output += strings.raw[index]
return output
}
15. 模板字符串的限制
\u和\x在 LaTEX 里面有特殊含義,但是 JavaScript 將它們轉(zhuǎn)義了。
ES2018 放松了對(duì)標(biāo)簽?zāi)0謇锩娴淖址D(zhuǎn)義的限制。如果遇到不合法的字符串轉(zhuǎn)義,就返回undefined,而不是報(bào)錯(cuò),并且從raw屬性上面可以得到原始字符串。
這種對(duì)字符串轉(zhuǎn)義的放松,只在標(biāo)簽?zāi)0褰馕鲎址畷r(shí)生效,不是標(biāo)簽?zāi)0宓膱?chǎng)合,依然會(huì)報(bào)錯(cuò)。