1、字元的Unicode表示法
JavaScript允許採用uxxxx
形式表示一個字元,其中“xxxx”
表示字元的碼點。
console.log("u0061");//a
但是,這種表示法只限於u0000——uFFFF
之間的字元。超出這個範圍的字元,必須用兩個雙位元組的形式表達。
console.log("uD842uDFB7");//?
console.log("u20BB7");//₻7
上面程式碼表示,如果直接在“u”
後面跟上超過0xFFFF
的數值(比如u20BB7
),JavaScript
會理解成“u20BB+7”
。由於u20BB
是一個不可列印字元,所以只會顯示一個空格,後面跟著一個7
。
ES6
對這一點做出了改進,只要將碼點放入大括號,就能正確解讀該字元。
console.log("u{20BB7}");//?
console.log("u{41}u{42}u{43}");//ABC
console.log(`u{1F680}` === `uD83DuDE80`);//true
上面程式碼中,最後一個例子表明,大括號表示法與四位元組的UTF-16
編碼是等價的。
有了這種表示法之後,JavaScript
共有6
種方法可以表示一個字元。
console.log(`z` === `z`);//true
console.log(`172` === `z`);//true
console.log(`x7A` === `z`);//true
console.log(`u007A` === `z`);//true
console.log(`u{7A}` === `z`);//true
2、codePointAt()位元組
codePointAt
方法,能夠正確處理4
個位元組儲存的字元,返回一個字元的碼點。
let s = "?a";
console.log(s.codePointAt(0));//134071
console.log(s.codePointAt(1));//57271
console.log(s.charCodeAt(2));//97
codePointAt
方法的引數,是字元在字串中的位置(從0
開始)。上面程式碼中,JavaScript
將“?a”
視為三個字元,codePointAt
方法在第一個字元上,正確地識別了“?”
,返回了它的十進位制碼點134071
(即十六進位制的20BB7
)。在第二個字元(即“?”
的後兩個位元組)和第三個字元“a”
上,codePointAt
方法的結果與charCodeAt
方法相同。
總之,codePointAt
方法會正確返回四位元組的UTF-16
字元的碼點。對於那些兩個位元組儲存的常規字元,它的返回結果與charCodeAt
方法相同。
codePointAt
方法是測試一個字元由兩個位元組還是由四個位元組組成的最簡單方法。
function is32Bit(c) {
return c.codePointAt(0) > 0xFFFF;
}
console.log(is32Bit("?"));//true
console.log(is32Bit("a"));//false
3、String.fromCodePoint()
ES5
提供String.fromCharCode
方法,用於從碼點返回對應字元,但是這個方法不能識別輔助平面的字元(編號大於0xFFFF
)。
String.fromCharCode(0x20BB7)
// "ஷ"
上面程式碼中,String.fromCharCode
不能識別大於0xFFFF
的碼點,所以0x20BB7
就發生了溢位,最高位2
被捨棄了,最後返回碼點U+0BB7
對應的字元,而不是碼點U+20BB7
對應的字元。
ES6
提供了String.fromCodePoint
方法,可以識別0xFFFF
的字元,彌補了String.fromCharCode
方法的不足。在作用上,正好與codePointAt
方法相反。
console.log(String.fromCodePoint(0x20BB7));
//?
注意,fromCodePoint
方法定義在String
物件上,而codePointAt
方法定義在字串的例項物件上。
4、includes(), startsWith(), endsWith()
傳統上,JavaScript
只有indexOf
方法,可以用來確定一個字串是否包含在另一個字串中。
ES6又提供了三種新方法。
includes()
:返回布林值,表示是否找到了引數字串。
startsWith()
:返回布林值,表示引數字串是否在源字串的頭部。
endsWith()
:返回布林值,表示引數字串是否在源字串的尾部。
let s = `Hello World!`;
console.log(s.startsWith(`Hello`));//true
console.log(s.endsWith(`!`));//true
console.log(s.includes(`o`));//true
這三個方法都支援第二個引數,表示開始搜尋的位置。
let s = `Hello world!`;
console.log(s.startsWith(`world`, 6));//true
console.log(s.endsWith(`Hello`, 5));//true
console.log(s.includes(`Hello`, 6));//false
上面程式碼表示,使用第二個引數n
時,endsWith
的行為與其他兩個方法有所不同。它針對前n
個字元,而其他兩個方法針對從第n
個位置直到字串結束。
5、repeat()重複次數
repeat
方法返回一個新字串,表示將原字串重複n
次。
console.log(`x`.repeat(3));//xxx
console.log(`na`.repeat(0));//""
引數如果是小數,會被取整。
console.log(`na`.repeat(2.9));//nana
如果repeat
的引數是負數
或者Infinity
,會報錯。
但是,如果引數是0
到-1
之間的小數,則等同於0
,這是因為會先進行取整運算。0
到-1
之間的小數,取整以後等於-0
,repeat
視同為0
。
console.log(`na`.repeat(-0.9));//""
引數NaN
等同於0
。
console.log(`na`.repeat(NaN));//""
如果repeat
的引數是字串,則會先轉換成數字。
console.log(`na`.repeat(`na`));//""
console.log(`na`.repeat(`3`));//nanana