String.fromCodePoint()
String.fromCharCode()方法不能識別碼點大于0xFFFF的字符,String.fromCodePoint()方法彌補了上述方法的不足
注意:fromCodePoint方法定義在String對象上,而codePointAt方法定義在字符串的實例對象上。
String.raw()
該方法返回一個斜杠都被轉(zhuǎn)義的字符串,如下
String.raw`Hi\\n`
// 返回 "Hi\\\\n"
String.raw`Hi\\n` === "Hi\\\\n" // true
String.raw()方法也可以作為一個正常的函數(shù)使用。第一個參數(shù)是一個具有raw屬性的對象,,raw屬性的值應(yīng)該是一個數(shù)組
String.raw({ raw: 'test' }, 0, 1, 2);
// 't0e1s2t'
// 等同于
String.raw({ raw: ['t','e','s','t'] }, 0, 1, 2);
codePointAt()
對于四個字節(jié)的字符,JavaScript不能正確處理,但codePointAt()方法能正確處理4個字節(jié)存儲的字符,返回一個字符的碼點
let s = '??a';
s.codePointAt(0) // 134071
s.codePointAt(1) // 57271
s.codePointAt(2) // 97
這個方法返回的碼點是十進(jìn)制的,可以用toString()方法轉(zhuǎn)化成十六進(jìn)制的
let s = '??a';
s.codePointAt(0).toString(16) // "20bb7"
s.codePointAt(2).toString(16) // "61"
上面代碼的字符串‘a(chǎn)’應(yīng)該是在位置1的,但是必須向codePointAt()方法中傳入2??梢杂?code>for...of循環(huán)解決問題。另外,也可以用擴(kuò)展運算符(...)進(jìn)行展開運算
let s = '??a';
for (let ch of s) {
console.log(ch.codePointAt(0).toString(16));
}
// 20bb7
// 61
let arr = [...'??a']; // arr.length === 2
arr.forEach(
ch => console.log(ch.codePointAt(0).toString(16))
);
// 20bb7
// 61
可以用codePointAt()方法測試一個 字符由兩個字節(jié)還是四個字節(jié)組成的。
function is32Bit(c) {
return c.codePointAt(0) > 0xFFFF;
}
is32Bit("??") // true
is32Bit("a") // false
normalize()
normalize()方法用來將字符的不同表示方法統(tǒng)一為同樣的形式,這稱為 Unicode 正規(guī)化。
normalize方法可以接受一個參數(shù)來指定normalize的方式,參數(shù)的四個可選值如下。
-
NFC,默認(rèn)參數(shù),表示“標(biāo)準(zhǔn)等價合成”,返回多個簡單字符的合成字符。所謂“標(biāo)準(zhǔn)等價”指的是視覺和語義上的等價。 -
NFD,表示“標(biāo)準(zhǔn)等價分解”,即在標(biāo)準(zhǔn)等價的前提下,返回合成字符分解的多個簡單字符。 -
NFKC,表示“兼容等價合成”,返回合成字符。所謂“兼容等價”指的是語義上存在等價,但視覺上不等價,比如“囍”和“喜喜”。(這只是用來舉例,normalize方法不能識別中文。) -
NFKD,表示“兼容等價分解”,即在兼容等價的前提下,返回合成字符分解的多個簡單字符。
repeat()
這個方法返回一個字符串,表示將原字符串重復(fù)n次。如果參數(shù)是小數(shù),則會被取整。參數(shù)是負(fù)數(shù)或者Infinity,會報錯。
但是,如果參數(shù)是 0 到-1 之間的小數(shù),則等同于 0,這是因為會先進(jìn)行取整運算。
trimStart(),trimEnd()
trimStart()消除字符串頭部的空格,trimEnd()消除尾部的空格
參考資料
阮一峰《ECMAScript 6 入門》