前言

本章主要是內(nèi)容為是 ES6 對字符串的改造和增強(qiáng)。
本章記錄字符串的擴(kuò)展常用重點(diǎn)部分,不常用知識稍作記錄。
本章原文鏈接: 字符串的擴(kuò)展

模板字符串(template string)

ES6字符串的擴(kuò)展最常用的就是模版字符串了
模板字符串,都是用反引號表示。如果在模板字符串中需要使用反引號,則前面要用反斜杠轉(zhuǎn)義。

  • 模版字符串 保留空格和換行。
  • 模版字符串 是允許嵌入變量名或表達(dá)式。
  • 模版字符串 可以嵌套模版字符串。
  • 模版字符串 "標(biāo)簽?zāi)0?功能

模版字符串保留空格和換行,直接在模版字符串中使用換行與空格就行

//  模版字符串保留空格和換行const SAMPLE = ` 
  • list1
  • list2
  • list3
  • list4
`;console.log(SAMPLE);// 輸出結(jié)果為/*
  • list1
  • list2
  • list3
  • list4
*/

模版字符串使用變量與字符串需要寫在${} 的大括號中,在大括號中也可以寫字符串。

// 在模版字符串中使用變量與表達(dá)式let sampleName = "gssg";let sampleAge = 10;let sampleAge1 = 8;const SAMPLE = `My name is ${sampleName} and MY age is ${sampleAge + sampleAge1} years old`;console.log(SAMPLE);// 輸出 My name is gssg and MY age is 18 years old

在模版字符串中還可以寫模版字符串,利用${}來嵌套。

// 模版字符串的嵌套const SAMPLE = `  
    ${`
  • list1
  • list2
  • `}
`;console.log(SAMPLE);// 輸出 /*
  • list1
  • list2
  • */

    模版字符串可以緊跟在一個(gè)函數(shù)名后面,該函數(shù)將被調(diào)用來處理這個(gè)模板字符串。這被稱為“標(biāo)簽?zāi)0濉惫δ埽╰agged template)。
    標(biāo)簽?zāi)0迤鋵?shí)不是模板,而是函數(shù)調(diào)用的一種特殊形式。“標(biāo)簽”指的就是函數(shù),緊跟在后面的模板字符串就是它的參數(shù)。

    alert`hello`;// 等同于alert([hello]);// 模板字符串前面有一個(gè)標(biāo)識名tag,它是一個(gè)函數(shù)。整個(gè)表達(dá)式的返回值,就是tag函數(shù)處理模板字符串后的返回值。let sample = 5;let sample1 = 10;tag`Hello ${sample} world ${sample + sample1}`;// 等同于tag([Hello ,  world , ], 5, 15);

    Unicode

    Unicode的目標(biāo)是為世界上每一個(gè)字符提供唯一標(biāo)識符,唯一標(biāo)識符稱為碼位或碼點(diǎn)(code point)。而這些碼位是用于表示字符的,又稱為字符編碼(character encode)

    ES6 加強(qiáng)了對 Unicode 的支持,允許采用/uxxxx形式表示一個(gè)字符,其中xxxx表示字符的 Unicode 碼點(diǎn)。

    console.log("/u0062"); // b// 也可以使用大括號將原來超過 0xFFFF 的數(shù)值,正確解讀console.log("/u{20FFF}"); // ????

    字符串的遍歷器接口

    ES6 為字符串添加了遍歷器接口(這部分內(nèi)容在后面),使得字符串可以被for...of循環(huán)遍歷。

    for (let item of sample) {  console.log(item);}// 逐個(gè)輸出/*lpmase*/

    這個(gè)遍歷器最大的優(yōu)點(diǎn)是可以識別大于0xFFFF的碼點(diǎn),傳統(tǒng)的for循環(huán)無法識別這樣的碼點(diǎn)。

    let sample = "/u{20FFF}";for (let item of sample) {  console.log(item);}// 輸出 ????

    JSON.stringify() 的改造

    根據(jù)標(biāo)準(zhǔn),JSON 數(shù)據(jù)必須是 UTF-8 編碼。但是,現(xiàn)在的JSON.stringify()方法有可能返回不符合 UTF-8 標(biāo)準(zhǔn)的字符串。

    ES2019 改變了JSON.stringify()的行為。如果遇到0xD8000xDFFF之間的單個(gè)碼點(diǎn),或者不存在的配對形式,它會返回轉(zhuǎn)義字符串,留給應(yīng)用自己決定下一步的處理。

    let sample = JSON.stringify(/u{D834});let sample1 = JSON.stringify(/uDF06/uD834);console.log(sample, sample1); // "/ud834" "/udf06/ud834"