Node v4 – 字串的擴充套件

whjin發表於2019-02-16

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之間的小數,取整以後等於-0repeat視同為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

相關文章