ES6 學(xué)習(xí)筆記(3) 字符串?dāng)U展

1. 字符串的Unicode表示方法


javaScript允許采用\uxxxx形式表示字符串, xxxx表示字符的unicode碼點(diǎn)
這種表示法只限于\u0000 --\uFFFF之間的字符, 超出這個(gè)范圍必須使用雙字節(jié)

  '\u0061'  // a
  '\uD847\uDFB7'  // '吉'

es6對(duì)超過碼點(diǎn)進(jìn)行的改進(jìn),只需將碼點(diǎn)放入大括號(hào)就能正確讀解該字符

  '\u{1F680}' === '\uD83D\uDE80'
  // true

有了這之后JavaScript有六種方法表示一個(gè)字符

  '\z' === 'z'  // true
  '\172' === 'z' // true
  '\x7A' === 'z' // true
  '\u007A' === 'z' // true
  '\u{7A}' === 'z' // true

2. codePoinAt()


JavaScript內(nèi)部,字符已UTF-16的格式存儲(chǔ),每個(gè)字符固定為2個(gè)字節(jié),.對(duì)于那些需要4個(gè)字節(jié)存儲(chǔ)的的字符(unicode碼點(diǎn)大于0xFFFF),會(huì)認(rèn)為他們是兩個(gè)字符 。
codPoinAt能夠正確處理4個(gè)字節(jié)存儲(chǔ)的字符返回一個(gè)字符的碼點(diǎn)

  var s = '吉';
  s.length     // 2
  s.chart(0)  // "
  s.chart(1)  // ''
  s.charCodeAt(0)  // 55362
  s.charCodeAt(1)  // 57271

  s.codePointAt(0)  //134071
  s.codePoinAt(1)  //57271

總之,codePointAt方法會(huì)正確返回 32 位的 UTF-16 字符的碼點(diǎn)。對(duì)于那些兩個(gè)字節(jié)儲(chǔ)存的常規(guī)字符,它的返回結(jié)果與charCodeAt方法相同。

codePointAt方法返回的是碼點(diǎn)的十進(jìn)制值,如果想要十六進(jìn)制的值,可以使用toString方法轉(zhuǎn)換一下。

  let s = '??a';
  s.codePointAt(0).toString(16) // "20bb7"
  s.codePointAt(2).toString(16) // "61"

codePointAt方法是測(cè)試一個(gè)字符是由兩個(gè)字節(jié)還是四個(gè)字節(jié)組成的最簡(jiǎn)單的方法

3. String.fromCodePoint()


ES5中String.fromcharCode方法用于從碼點(diǎn)返回對(duì)應(yīng)字符,但是不能識(shí)別32位的UTF-16字符(unicode編號(hào)大于0xFFFF).

  String.fromCharCode(0x20BB7)
  // "?"

ES6 提供了String.fromCodePoin放大可識(shí)別大于0xFFFF的字符 作用上與codePionAt相反

  String.fromCodePoint(0x20BB7)
  // "??"
  String.fromCodePoint(0x78, 0x1f680, 0x79) === 'x\uD83D\uDE80y'
  // true

4. 字符串遍歷接口


ES6 為字符串添加了遍歷器接口,使得字符串可以被for...of循環(huán)遍歷。

  for (let code in 'foo') {
    console.log(code)  //  'f' 'o' 'o'
  }

5. at()


ES5 提供了chartAt方法,返回字符串的給定位置的字符 該方法不能識(shí)別碼點(diǎn)大于0xFFFF的字符
目前,有一個(gè)提案,提出字符串實(shí)例的at方法,可以識(shí)別 Unicode 編號(hào)大于0xFFFF的字符,返回正確的字符。

6. normalize()


normalize方法可以接受一個(gè)參數(shù)來指定normalize的方式,參數(shù)的四個(gè)可選值如下。

  • NFC,默認(rèn)參數(shù),表示“標(biāo)準(zhǔn)等價(jià)合成”(Normalization Form Canonical Composition),返回多個(gè)簡(jiǎn)單字符的合成字符。所謂“標(biāo)準(zhǔn)等價(jià)”指的是視覺和語(yǔ)義上的等價(jià)。
  • NFD,表示“標(biāo)準(zhǔn)等價(jià)分解”(Normalization Form Canonical Decomposition),即在標(biāo)準(zhǔn)等價(jià)的前提下,返回合成字符分解的多個(gè)簡(jiǎn)單字符。
  • NFKC,表示“兼容等價(jià)合成”(Normalization Form Compatibility Composition),返回合成字符。所謂“兼容等價(jià)”指的是語(yǔ)義上存在等價(jià),但視覺上不等價(jià),比如“囍”和“喜喜”。(這只是用來舉例,normalize方法不能識(shí)別中文。)
  • NFKD,表示“兼容等價(jià)分解”(Normalization Form Compatibility Decomposition),即在兼容等價(jià)的前提下,返回合成字符分解的多個(gè)簡(jiǎn)單字符。
    不過,normalize方法目前不能識(shí)別三個(gè)或三個(gè)以上字符的合成。這種情況下,還是只能使用正則表達(dá)式,通過 Unicode 編號(hào)區(qū)間判斷。

7. includes() , startsWith() , endsWith()


  • includes() : 返回布爾值 , 表示是否找到參數(shù)字符串
  • startsWith() : 返回布爾值 , 表示參數(shù)字符串是否在原字符串頭部
  • endsWith() : 返回布爾值 , 表示參數(shù)字符串是否在原字符串尾部
    都支持第二個(gè)參數(shù)表示開始搜索的位置 (endsWith 針對(duì)前 n個(gè)字符)
  let s = 'hello' ;
  s.startsWith('h')  // true
  s.endsWith('o')  // true
  s.includes('ll' , 0)    // true

8. repeat()


repeat() 方法返回一個(gè)新的字符串,表示將原字符串重復(fù)n

  'x'.repeat(3)  // 'xxx'
  // 參數(shù)如果是小數(shù),會(huì)被取整
   'x'.repeat(2.9)  // 'xxx'
  // 參數(shù)如果是負(fù)數(shù),或者```Infinity```,會(huì)報(bào)錯(cuò)
   'x'.repeat(Infinity)  //  Error
  // 0-1之間的小數(shù)  和 NaN 等同于0 
  // 參數(shù)是字符串則會(huì)先轉(zhuǎn)換成數(shù)字
  'na'.repeat('na')  // ''
  'na'.repea('3')   // 'nanana'

9. padStart() , padEnd()


ES8 引入了字符串全長(zhǎng)度補(bǔ)全功能.padStart()補(bǔ)全頭部,padEnd()補(bǔ)全尾部

  'x'.padStart(6 , 'abc')   // 'abcabx'
  'x'.padEnd(6, 'abc')     // 'xabcab'
  // 第一個(gè)參數(shù)為最小長(zhǎng)度, 第二個(gè)為補(bǔ)全的字符串
  // 如果原字符串的長(zhǎng)度 等于或大于指定的最小長(zhǎng)度,則返回原字符串
  `xxx`.padStart(2 , 'a')  //  'xxx'
  // 如果原字符串和補(bǔ)全字符串的長(zhǎng)度之和超過制定最小長(zhǎng)度,則會(huì)截去補(bǔ)全字符串超出的位數(shù)
  'xxxxxx'.padEnd(10,'aaaaaaaa')  // 'xxxxxxaaaa'
  // 如果省略第二個(gè)參數(shù), 默認(rèn)使用空格補(bǔ)全長(zhǎng)度
  'a'.padStart(5)  // '    a'

常見用途

  // padStart的常見用途是為數(shù)值補(bǔ)全指定位數(shù)。下面代碼生成 10 位的數(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. matchAll()


matchAll方法返回一個(gè)正則表達(dá)式在當(dāng)前字符串的所有匹配

11. 模板字符串


  • 模板字符串(template string)是增強(qiáng)版的字符串,用反引號(hào)(`)標(biāo)識(shí)。它可以當(dāng)作普通字符串使用,也可以用來定義多行字符串,或者在字符串中嵌入變量。
  // 普通字符串
  `In JavaScript `\n` is a line-feed`
  // 多行模板字符串
  ` In JavaScript 
     is a line-feed `
  console.log(`string text line 1 
               string text line 2`);
  // 字符串中嵌入變量
  // 模板字符串中嵌入變量,需要將變量名寫在${}之中。
  let name = "Bob", time = "today";
  `Hello ${name}, how are you ${time}?`
  • 模板字符串要用反引號(hào)表示, 如果在模板字符串中需要使用反引號(hào) 則需反斜杠轉(zhuǎn)譯
  • 模板字符串的空格和換行都是被保留的 如果不想要 可以使用trim消除
  $('#list').html(`
    <ul>
        <li>first</li>
        <li>second</li>
    </ul>
  `.trim());
  • 大括號(hào)內(nèi)部可以放入任意的 JavaScript 表達(dá)式,可以進(jìn)行運(yùn)算,以及引用對(duì)象屬性。
  • 模板字符串之中還能調(diào)用函數(shù)。
  • 如果大括號(hào)中的值不是字符串,將按照一般的規(guī)則轉(zhuǎn)為字符串。比如,大括號(hào)中是一個(gè)對(duì)象,將默認(rèn)調(diào)用對(duì)象的toString方法。
  • 如果模板字符串中的變量沒有聲明,將報(bào)錯(cuò)。
  • 模板字符串甚至還能嵌套。

12. [模板編譯] (http://es6.ruanyifeng.com/#docs/string)

13. [標(biāo)簽?zāi)0錧 (http://es6.ruanyifeng.com/#docs/string)


模板字符串的功能,不僅僅是上面這些。它可以緊跟在一個(gè)函數(shù)名后面,該函數(shù)將被調(diào)用來處理這個(gè)模板字符串。這被稱為“標(biāo)簽?zāi)0濉惫δ埽╰agged template)。

14. String.raw()


  • String.raw方法,往往用來充當(dāng)模板字符串的處理函數(shù),返回一個(gè)斜杠都被轉(zhuǎn)義(即斜杠前面再加一個(gè)斜杠)的字符串,對(duì)應(yīng)于替換變量后的模板字符串。
  String.raw`Hi\n${2+3}!`;
  // 返回 "Hi\\n5!"

  String.raw`Hi\u000A!`;
  // 返回 "Hi\\u000A!"

  String.raw`Hi\\n`
  // 返回 "Hi\\\\n"
  • String.raw方法可以作為處理模板字符串的基本方法,它會(huì)將所有變量替換,而且對(duì)斜杠進(jìn)行轉(zhuǎn)義,方便下一步作為字符串來使用。
  • 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);
  • 作為函數(shù),String.raw的代碼實(shí)現(xiàn)基本如下。
String.raw = function ( String , ...values) {
  let output = ''  ;
  let index 
  for (index = 0 ;index < values.length ;index++) {
    optput += strings.raw[index] + values[index]; 
  }
  output += strings.raw[index]
  return output
}

15. 模板字符串的限制

\u和\x在 LaTEX 里面有特殊含義,但是 JavaScript 將它們轉(zhuǎn)義了。
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宓膱?chǎng)合,依然會(huì)報(bào)錯(cuò)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容