1. 字符的Unicode表示法
如果直接在“\u”后面跟上超過(guò)0xFFFF的數(shù)值(比如\u20BB7),JavaScript會(huì)理解成“\u20BB+7”属愤。由于\u20BB是一個(gè)不可打印字符永高,所以只會(huì)顯示一個(gè)空格蔬胯,后面跟著一個(gè)7资盅。
ES6對(duì)這一點(diǎn)做出了改進(jìn)漓库,只要將碼點(diǎn)放入大括號(hào)羽峰,就能正確解讀該字符趟咆。
"\u{20BB7}" // "??""
\u{41}\u{42}\u{43}" // "ABC"
let hello = 123;
hell\u{6F} // 123
'\u{1F680}' === '\uD83D\uDE80' // true
有了這種表示法之后添瓷,JavaScript共有6種方法可以表示一個(gè)字符。
'\z' === 'z' // true
'\172' === 'z' // true
'\x7A' === 'z' // true
'\u007A' === 'z' // true
'\u{7A}' === 'z' // true
2. codePointAt()
ES6提供了codePointAt方法值纱,能夠正確處理4個(gè)字節(jié)儲(chǔ)存的字符鳞贷,返回一個(gè)字符的碼點(diǎn)。
var s = '??a';
s.codePointAt(0) // 134071
s.codePointAt(1) // 57271
s.charCodeAt(2) // 97
3. String.fromCodePoint()
ES6提供了String.fromCodePoint方法虐唠,可以識(shí)別大于0xFFFF的字符悄晃,彌補(bǔ)了String.fromCharCode方法的不足。在作用上凿滤,正好與codePointAt方法相反妈橄。
4. 字符串的遍歷器接口
for (let codePoint of 'foo') {
console.log(codePoint);
} //"f","o","o"
- 優(yōu)點(diǎn):可以識(shí)別大于0xFFFF的碼點(diǎn)。
5. at()
- 優(yōu)點(diǎn):可以識(shí)別Unicode編號(hào)大于0xFFFF的字符翁脆,返回正確的字符眷蚓。
'abc'.at(0) // "a"
'??'.at(0) // "??"
6. normalize()
7. includes(),startsWith(),endsWith()
- includes():返回布爾值,表示是否找到了參數(shù)字符串反番。
- startsWith():返回布爾值沙热,表示參數(shù)字符串是否在源字符串的頭部。
- endsWith():返回布爾值罢缸,表示參數(shù)字符串是否在源字符串的尾部篙贸。
這三個(gè)方法都支持第二個(gè)參數(shù),表示開(kāi)始搜索的位置枫疆。
使用第二個(gè)參數(shù)n時(shí)爵川,endsWith的行為與其他兩個(gè)方法有所不同。它針對(duì)前n個(gè)字符息楔,而其他兩個(gè)方法針對(duì)從第n個(gè)位置直到字符串結(jié)束寝贡。
8. repeat()
- repeat方法返回一個(gè)新字符串,表示將原字符串重復(fù)n次
- 如果是小數(shù)值依,會(huì)被取整圃泡。
- 如果參數(shù)是負(fù)數(shù)或者infinity,報(bào)錯(cuò)愿险。
- 如果是0到-1之間的小數(shù)颇蜡,等同于0.
- 參數(shù)NaN等同于0.
- 如果參數(shù)是字符串辆亏,則會(huì)先轉(zhuǎn)換成數(shù)字风秤。
9. padStart(),padEnd()
ES6推出了字符串補(bǔ)全長(zhǎng)度的功能。如果某個(gè)字符串不夠指定長(zhǎng)度褒链,會(huì)在頭部或尾部補(bǔ)全唁情。padStart
用于頭部補(bǔ)全疑苔,padEnd用于尾部補(bǔ)全甫匹。
'x'.padStart(5, 'ab') // 'ababx'
'x'.padStart(4, 'ab') // 'abax'
'x'.padEnd(5, 'ab') // 'xabab'
'x'.padEnd(4, 'ab') // 'xaba'
- 如果原字符串的長(zhǎng)度,等于或大于指定的最小長(zhǎng)度,則返回原字符串兵迅。
- 如果用來(lái)補(bǔ)全的字符串與原字符串抢韭,兩者的長(zhǎng)度之和超過(guò)了指定的最小長(zhǎng)度,則會(huì)截去超出位數(shù)的補(bǔ)全字符串恍箭。
- 如果省略第二個(gè)參數(shù)刻恭,則會(huì)用空格補(bǔ)全長(zhǎng)度。
- padStart的常見(jiàn)用途是為數(shù)值補(bǔ)全指定位數(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. 模板字符串
傳統(tǒng)的JavaScript語(yǔ)言,輸出模板如下:
$('#result').append(
'There are <b>' + basket.count + '</b> ' +
'items in your basket, ' +
'<em>' + basket.onSale +
'</em> are on sale!'
);
ES6引入了模板字符串交洗,如下:
$('#result').append(
` There are <b>${basket.count}</b> items
in your basket, <em>${basket.onSale}</em>
are on sale!`
);
- 模板字符串中嵌入變量骑科,需要將變量名寫(xiě)在${}中。
function authorize(user, action) {
if (!user.hasPrivilege(action)) {
throw new Error(
// 傳統(tǒng)寫(xiě)法為
// 'User '
// + user.name
// + ' is not authorized to do '
// + action
// + '.'
`User ${user.name} is not authorized to do ${action}.`);
}
}
- 大括號(hào)內(nèi)部可以放入任意的JavaScript表達(dá)式构拳,可以進(jìn)行運(yùn)算咆爽,以及引用對(duì)象屬性。
var x =1;
var y = 2;
'${x} + ${y} = ${x+y};
// 1 + 2 = 3
- 模板字符串之中還能調(diào)用函數(shù)
如果大括號(hào)中的值不是字符串置森,將按照一般的規(guī)則轉(zhuǎn)為字符串斗埂。如:大括號(hào)中是一個(gè)對(duì)象,將默認(rèn)調(diào)用對(duì)象的toString方法凫海。
- 如果模板字符串中的變量沒(méi)有聲明呛凶,報(bào)錯(cuò)。
- 如果大括號(hào)中是一個(gè)字符串行贪,將原樣輸出把兔。
- 模板字符串可以嵌套。
11. 標(biāo)簽?zāi)0?/h3>
模板字符串可以緊跟在一個(gè)函數(shù)后面瓮顽,該函數(shù)被調(diào)用來(lái)處理這個(gè)模板字符串县好。
alert '123';
//等同于
alert(123);
12. String.raw()
-
該方法往往用來(lái)充當(dāng)模板字符串的處理函數(shù),返回一個(gè)斜杠都被轉(zhuǎn)義(即斜杠錢(qián)再加一個(gè)斜杠)的字符串暖混,對(duì)應(yīng)于替換變量后的模板字符串缕贡。
String.rawHi\n${2+3}!
;
// "Hi\n5!"String.raw`Hi\u000A!`; // 'Hi\\u000A!'
如果原字符串的斜杠已經(jīng)轉(zhuǎn)義,那么String.raw不會(huì)做任何處理拣播。
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);