es6第四章學(xué)習(xí)
字符串的擴(kuò)展
1.字符的 Unicode 表示法
- ES6 加強(qiáng)了對(duì) Unicode 的支持装哆,允許采用
\uxxxx
形式表示一個(gè)字符载庭,其中xxxx
表示字符的 Unicode 碼點(diǎn)统捶。"\u0061" // "a"
- 這種表示法只限于碼點(diǎn)在\u0000~\uFFFF之間的字符鸽素。超出這個(gè)范圍的字符务甥,必須用兩個(gè)雙字節(jié)的形式表示。ES6 對(duì)這一點(diǎn)做出了改進(jìn)呜袁,只要將碼點(diǎn)放入大括號(hào),就能正確解讀該字符简珠。
- 因此JavaScript 共有 6 種方法可以表示一個(gè)字符阶界。
'\z' === 'z' // true
'\172' === 'z' // true
'\x7A' === 'z' // true
'\u007A' === 'z' // true
'\u{7A}' === 'z' // true
2.字符串的遍歷器接口
- ES6 為字符串添加了遍歷器接口(詳見《Iterator》一章),使得字符串可以被for...of循環(huán)遍歷聋庵。
for (let codePoint of 'foo') {
console.log(codePoint)
}
// "f"
// "o"
// "o"
除了遍歷字符串膘融,這個(gè)遍歷器最大的優(yōu)點(diǎn)是可以識(shí)別大于0xFFFF的碼點(diǎn),傳統(tǒng)的for循環(huán)無法識(shí)別這樣的碼點(diǎn)祭玉。
3.直接輸入U(xiǎn)+2028 和 U+2029
- JavaScript 字符串允許直接輸入字符氧映,以及輸入字符的轉(zhuǎn)義形式。例如
'中' === '\u4e2d' // true
- 但是脱货,JavaScript 規(guī)定有5個(gè)字符岛都,不能在字符串里面直接使用,只能使用轉(zhuǎn)義形式振峻。
- U+005C:反斜杠(reverse solidus)
- U+000D:回車(carriage return)
- U+2028:行分隔符(line separator)
- U+2029:段分隔符(paragraph separator)
- U+000A:換行符(line feed)
4.JSON.stringify() 的改造
- 根據(jù)標(biāo)準(zhǔn)臼疫,JSON 數(shù)據(jù)必須是 UTF-8 編碼。但是扣孟,現(xiàn)在的JSON.stringify()方法有可能返回不符合 UTF-8 標(biāo)準(zhǔn)的字符串烫堤。UTF-8 標(biāo)準(zhǔn)規(guī)定,0xD800到0xDFFF之間的碼點(diǎn)哈打,不能單獨(dú)使用塔逃,必須配對(duì)使用,JSON.stringify()的問題在于料仗,它可能返回0xD800到0xDFFF之間的單個(gè)碼點(diǎn)湾盗。
- 為了確保返回的是合法的 UTF-8 字符,ES2019 改變了JSON.stringify()的行為立轧。如果遇到0xD800到0xDFFF之間的單個(gè)碼點(diǎn)格粪,或者不存在的配對(duì)形式躏吊,它會(huì)返回轉(zhuǎn)義字符串,留給應(yīng)用自己決定下一步的處理帐萎。
5.模板字符串
- 傳統(tǒng)的 JavaScript 語言比伏,輸出模板通常是這樣寫的(下面使用了 jQuery 的方法)。
$('#result').append(
'There are <b>' + basket.count + '</b> ' +
'items in your basket, ' +
'<em>' + basket.onSale +
'</em> are on sale!'
);
- 上面這種寫法相當(dāng)繁瑣不方便疆导,ES6 引入了模板字符串解決這個(gè)問題赁项。
$('#result').append(`
There are <b>${basket.count}</b> items
in your basket, <em>${basket.onSale}</em>
are on sale!
`);
6.標(biāo)簽?zāi)0?/h4>
模板字符串的功能,不僅僅是上面這些澈段。它可以緊跟在一個(gè)函數(shù)名后面悠菜,該函數(shù)將被調(diào)用來處理這個(gè)模板字符串。這被稱為“標(biāo)簽?zāi)0濉惫δ埽╰agged template)败富。
alert`123`
// 等同于
alert(123)
“標(biāo)簽”指的就是函數(shù)悔醋,緊跟在后面的模板字符串就是它的參數(shù),但是,如果模板字符里面有變量兽叮,就不是簡單的調(diào)用了芬骄,而是會(huì)將模板字符串先處理成多個(gè)參數(shù),再調(diào)用函數(shù)鹦聪。
let a = 5;
let b = 10;
tag`Hello ${ a + b } world ${ a * b }`;
// 等同于
tag(['Hello ', ' world ', ''], 15, 50);
- “標(biāo)簽?zāi)0濉钡囊粋€(gè)重要應(yīng)用账阻,就是過濾 HTML 字符串,防止用戶輸入惡意內(nèi)容椎麦。
- 標(biāo)簽?zāi)0宓牧硪粋€(gè)應(yīng)用宰僧,就是多語言轉(zhuǎn)換(國際化處理)。
- 除此之外观挎,你甚至可以使用標(biāo)簽?zāi)0迩俣?JavaScript 語言之中嵌入其他語言。
7.模板字符串的限制
- 前面提到標(biāo)簽?zāi)0謇锩驵医荩梢詢?nèi)嵌其他語言造成。但是,模板字符串默認(rèn)會(huì)將字符串轉(zhuǎn)義雄嚣,導(dǎo)致無法嵌入其他語言晒屎。
- 為了解決這個(gè)問題,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宓膱龊霞辏廊粫?huì)報(bào)錯(cuò)。