Es6 模板字符串及新增方法

模板字符串(template string) 是增強版的字符串,用反引號 ( ` ) 標識。它可以當(dāng)作普通字符串使用萌抵,也可以用來定義多行字符串,或者在字符串中嵌入變量元镀。

// 普通字符串
console.log(`In JavaScript \n is a line-feed.`);
// 多行字符串
console.log(`In JavaScript this is 
not legal.`);
// 字符串中嵌入變量
let name = "baby";
console.log(`Hi ${name},`);

如果在模板字符串中需要使用反引號绍填,則前面要用反斜杠轉(zhuǎn)義。

let greeting = `\`Yo\` World~`;
console.log(greeting);  // `Yo` World~

如果使用模板字符串表示多行字符串栖疑,所有的空格和縮進都會被保留在輸出中讨永。

console.log(`
  <ul>
    <li>first</li>
    <li>second</li>
  </ul>
`);

如果不想要這些換行,可以使用 trim 方法消除它遇革。

console.log(`
  <ul>
    <li>first</li>
    <li>second</li>
  </ul>
`.trim());

模板字符串嵌入變量卿闹,需要將變量名寫在 ${} 之中。

let x = 1;
let y = 2;
console.log(`${x} + ${y} = ${x + y}`);  // 1 + 2 = 3
console.log(`${x} + ${y * 2} = ${x + y * 2}`);  // 1 + 4 = 5
let obj = {x: 1, y: 2};
console.log(`${obj.x + obj.y}`);  // 3

模板字符串中還能調(diào)用函數(shù)萝快。

function fn () {
  return "or";
}
console.log(`foo ${fn()} bar`);  // foo or bar

如果模板字符串中的變量沒有聲明锻霎,將報錯。

let msg = `Hello, ${place}`;  // Error

由于模板字符串的大括號內(nèi)部揪漩,就是執(zhí)行 JavaScript 代碼旋恼,因此如果大括號內(nèi)部是一個字符串,將會原樣輸出氢拥。

console.log(`Hello ${'World'}`);  // Hello World

模板字符串的功能蚌铜,不僅僅是上面這些锨侯。它可以緊跟在一個函數(shù)名后面,該函數(shù)將被調(diào)用來處理這個模板字符串冬殃。這被稱為 “標簽?zāi)0濉?功能(tagged template)囚痴。

alert`123`;
// 等同于
alert(123);

字符串新增方法

String.fromCharCode()

Es5 提供 String.fromCharCode() 方法,用于從 Unicode 碼點返回對應(yīng)字符审葬,但是這個方法不能識別碼點大于 0xFFFF 的字符深滚。

console.log(String.fromCharCode(96));  // "`"
console.log(String.fromCharCode(0x20BB7));  // ?

上面代碼中,String.fromcharCode() 不能識別大于 0xFFFF 的碼點涣觉,所以 0x20BB7 就發(fā)生了溢出痴荐,最高位 2 被舍棄了,最后返回碼點 U + 0BB7 對應(yīng)的字符官册,而不是碼點 U + 20BB7 對應(yīng)的字符生兆。

Es6 提供 String.fromCodePoint() 方法,可以識別大于 0xFFFF 的字符膝宁,彌補了 String.fromCharCode() 方法的補助鸦难。在作用上,正好與下面的 codePointAt() 方法相反员淫。

console.log(String.fromCodePoint(0x20BB7));  // "??"

如果 String.fromCodePoint() 對象有多個參數(shù)合蔽,則它會被合并一個字符串返回。

console.log(String.fromCodePoint(0x78, 0x1f680, 0x79));
console.log(String.fromCodePoint(0x78, 0x1f680, 0x79) === 'x\uD83D\uDE80y');  // true

注意介返,fromCodePoint() 方法定義在 String 對象上拴事,而 codePointAt 方法定義在字符串的實例對象上。

String.raw()

Es6 還為原生的 String 對象圣蝎,提供了一個 raw() 方法刃宵。該方法返回一個斜杠都被轉(zhuǎn)義(斜杠前面再加上一個斜杠)的字符串,往往用于模板字符串的處理辦法捅彻。

console.log(String.raw`Hi\n${2 + 3}!`);  // 實際返回 "Hi\\n5!"组去,顯示的是轉(zhuǎn)義后的結(jié)果 "Hi\n5!"

如果元字符串的斜杠已經(jīng)轉(zhuǎn)義,那么 String.raw() 會進行再次轉(zhuǎn)義步淹。

console.log(String.raw`Hi\\n`);  // Hi\\n
console.log(String.raw`Hi\\n` === "Hi\\\\n");  // true

String.raw() 方法可以作為處理模板字符串的基本辦法从隆,它會將所有變量替換,而且對斜杠進行轉(zhuǎn)義缭裆,方便下一步作為字符串來使用键闺。

實例方法:codePointAt()

JavaScript內(nèi)部,字符串以 UTF - 16 的格式儲存澈驼,每個字符固定為 2 個字節(jié)辛燥。對于那些需要 4 個字節(jié)儲存的字符(Unicode 碼點大于 0xFFFF 的字符),JavaScript 會認為它們是兩個字符。

{
  let s = "??";
  console.log(s.length);  // 2
  console.log(s.charAt(0));  // ?
  console.log(s.charAt(1));  // ?
  console.log(s.charCodeAt(0));  // 55362
  console.log(s.charCodeAt(1));  // 57271
}

上代碼中挎塌,漢字 “??”(注意徘六,這個字不是 “吉祥” 的 "吉")的碼點是 0x20BB7,UTF-16 編碼為 0xD842 0xDFB7(十進制為 55362 57271)榴都,需要 4 個字節(jié)儲存待锈。對于這種 4 個字節(jié)的字符,JavaScript 不能正確處理嘴高,字符串長度會誤判為 2竿音,而且 charAt() 方法無法讀取整個字符,charCodeAt() 方法只能分別返回前兩個字節(jié)和后兩個字節(jié)的值拴驮。

Es6 提供了 codePointAt() 方法春瞬,能夠正確處理 4 個字節(jié)存儲的字符,返回一個字符的碼點套啤。

{
  let s = "??a";
  console.log(s.codePointAt(0));  // 134071
  console.log(s.codePointAt(1));  // 57271
  console.log(s.codePointAt(2));  // 97
}

codePointAt() 方法的參數(shù)宽气,是字符在字符串中的位置(從 0 開始)。上面代碼中潜沦,JavaScript 將 "??a" 視為三個字符抹竹,codePointAt 方法在第一字符上,正確地認識了 "??"止潮,返回了它的十進制碼點 134071(即十六進制的 20BB7)。

codePointAt() 方法會正確返回 32 位的 UTF-16 字符的碼點钞楼。對于那些兩個字節(jié)儲存的常規(guī)字符喇闸,它的返回結(jié)果與 charCodeAt() 方法相同。

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

{
  let s = "??a";
  console.log(s.codePointAt(0).toString(16));  // "20bb7"
  console.log(s.codePointAt(2).toString(16));  // "61"
}

實例方法:normalize()

許多歐美語言有語調(diào)音符和重音符號宛琅。為表示刻蟹,Unicode 提供了兩種方法。

// 1嘿辟、直接代重音符號的字符
console.log('\u01D1');  // ǒ
// 2舆瘪、合成字符
console.log('\u004F\u030C');  // ǒ
console.log('\u01D1' === '\u004F\u030C');  // false。這兩種表示方法红伦,在視覺和語義上都等價英古,但是 JavaScript 不能識別
console.log('\u01D1'.length, '\u004F\u030C'.length);  // 1 2。JavaScript 將合成字符視為兩個字符昙读,導(dǎo)致兩種表示方法不相等召调。

Es6 提供字符串實例的 normalize() 方法,用來將字符串的不同表示方統(tǒng)一為同樣的形式,這稱為 Unicode 正規(guī)化唠叛。

console.log('\u01D1'.normalize() === '\u004F\u030C'.normalize());  // true

實例方法:includes(),startsWith(),endsWith()

JavaScript 只有 indexOf 方法只嚣,可以用來確定一個字符串是否包含在另一個字符串中。Es6 又提供了三種新方法艺沼。

  • includes(): 返回布爾值册舞,表示是否找到了參數(shù)字符串。
  • startsWith(): 返回布爾值澳厢,表示參數(shù)字符串是否在原字符串的頭部环础。
  • endsWith(): 返回布爾值,表示參數(shù)字符串是否在原字符串的尾部剩拢。
{
  let s = "Hello World~";
  console.log(s.startsWith('Hello'));  // true
  console.log(s.endsWith('~'));  // true
  console.log(s.includes('o'));  // true
}

這三個方法都支持第二個參數(shù)线得,表示開始搜索的位置。

{
  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
}

上面代碼表示徐伐,使用第二個參數(shù) n 時贯钩,endsWith 的行為與其他兩個方法有所不同。它針對前 n 個字符办素,而其他兩個方法對從第 n 個位置直到字符串結(jié)束角雷。

實例方法:repeat()

repeat() 方法返回一個新字符串,表示將原字符串重復(fù) n 次性穿。

console.log('x'.repeat(3));  // "xxx"
console.log('hello'.repeat(2));  // "hellohello"
console.log('na'.repeat(0));  // ""

參數(shù)如果是小數(shù)勺三,會被取整。

console.log('na'.repeat(2.9));  // "nana"

如果 repeat 的參數(shù)是負數(shù)或者 Infinity需曾,會報錯吗坚。

console.log('na'.repeat(Infinity));  // error
console.log('na'.repeat(-1));  // error

但是,如果參數(shù)是 0 到 -1 之間的小數(shù)呆万,則等同于 0商源,這是因為會先進性取整運算。0 到 -1 之間的小數(shù)谋减,取證后等于 -0牡彻,repeat 視為 0。

console.log('no'.repeat(-0.9));  // ""

參數(shù) NaN 等同于 0出爹。

console.log('na'.repeat(NaN));  // ""

如果 repeat() 的參數(shù)是字符串庄吼,則會先轉(zhuǎn)換為數(shù)字。如果 repeat() 的參數(shù)是字符串严就,則會先轉(zhuǎn)換為數(shù)字霸褒。

console.log('na'.repeat('na'));  // ""。 "na" ==> Number('na') ==> NaN == 0
console.log('na'.repeat('3'));  // "nanana"

實例方法:padStart(),padEnd()

Es2017 引入字符串補全長度的功能盈蛮。如果某個字符串不夠指定長度废菱,會在頭部或尾部補全技矮。padStart() 用于頭部補全,padEnd() 用于尾部補全殊轴。

padStart() 和 padEnd() 一共接收兩個參數(shù)衰倦,第一個參數(shù)是字符串補全生效的最大長度,第二個參數(shù)是用來補全的字符串旁理。

{
  console.log('x'.padStart(5, 'ab'));  // "ababx"
  console.log('x'.padStart(4, 'ab'));  // 'abax'
  console.log('x'.padEnd(5, 'ab'));  // "xabab"
  console.log('x'.padEnd(4, 'ab'));  // "xaba"
}

如果原字符串的長度樊零,等于或大于最大長度,則字符串補全不生效孽文,返回原字符串驻襟,

{
  console.log('xxx'.padStart(2, 'ab'));  // "xxx"
  console.log('xxx'.padEnd(2, 'ab'));  // "xxx"
}

如果用來補全的字符串與原字符串,兩者的長度之和超過了最大長度芋哭,則會截取超出位數(shù)的補全字符串沉衣。

{
  console.log('abc'.padStart(10, '0123456789'));  // "0123456abc"
}

如果忽略第二個參數(shù),默認使用空格補全長度减牺。

{
  console.log('x'.padStart(4));  // "   x"
  console.log('x'.padEnd(4));  // "x   "
}

padStart() 的常見用途是為數(shù)值補全指定位數(shù)豌习。

{
  console.log('1'.padStart(10, '0'));  // "0000000001"
  console.log('12'.padStart(10, '0'));  // "0000000012"
  console.log('123456'.padStart(10, '0'));  // "0000123456"
}

另一個用途是提示字符串格式。

{
  console.log('12'.padStart(10, 'YYYY-MM-DD'));  // "YYYY-MM-12"
  console.log('09-12'.padStart(10, 'YYYY-MM-DD'));  // "YYYY-09-12"
}

實例方法:timeStart(),timeEnd()

Es2019 對字符串實例新增了 trimStart() 和 trimEnd() 這兩個方法拔疚。它們的行為與 trim() 一致肥隆,trimStart() 消除字符串頭部的空格,trimEnd() 消除尾部的空格稚失。它們返回的都是新字符串栋艳,不會修改原字符串。

trimStart() 只消除頭部的空格句各,保留尾部的空格嘱巾。trimEnd() 也是類似行為。

{
  const s = '  abc  ';
  console.log(s.trim());  // "abc"
  console.log(s.trimStart());  // "abc  "
  console.log(s.trimEnd());  // "  abc"
}

除了空格鍵诫钓,這兩個方法字符串頭部(或尾部)的 tab 鍵、換行符等不可見的空白符也有效篙螟。

瀏覽器還部署了額外的兩個方法菌湃,trimLeft() 是 trimStart() 的別名,trimRight() 是 trimEnd() 的別名遍略。


Es5字符串方法

String.fromCharCode()

String.fromCharCode(Unicode); 從字符編碼創(chuàng)建一個字符串

實例方法:toString()

s.toString(args); 返回轉(zhuǎn)換后的字符串惧所。

實例方法:charAt()

s.charAt(number); 返回指定位置的字符。

實例方法:charCodeAt()

s.charCodeAt(number); 返回指定位置的字符編碼绪杏。

實例方法:concat()

s.concat(string); 拼接字符串下愈。

實例方法:indexOf()

s.indexOf(string); 方法返回某個指定的字符串值在字符串中首次出現(xiàn)的位置。參數(shù)1:必需蕾久。規(guī)定需檢索的字符串势似;參數(shù)2:可選的整數(shù)參數(shù)。規(guī)定在字符串中開始檢索的位置。它的合法取值是 0 到 stringObject.length - 1履因。如省略該參數(shù)障簿,則將從字符串的首字符開始檢索。

實例方法:lastIndexOf()

s.lastIndexOf(string); 從后向前搜索字符串栅迄。

實例方法:slice()

s.slice(start,end); 截取字符串站故,返回截取后字符串。1個參數(shù)毅舆,從第幾個開始截取到最后西篓;2個參數(shù),從第幾個截取到第幾個憋活。

實例方法:split()

s.split(''); 把字符串分割成數(shù)組岂津。不寫參數(shù)就會分成一個數(shù)組,有參數(shù)是根據(jù)參數(shù)字符串分割成指定數(shù)組余掖。

實例方法:substr()

s.substr(start,len); 從指定索引提取字符串中指定數(shù)目的字符串寸爆,1個參數(shù),從第幾個開始截取到最后盐欺;2個參數(shù)赁豆,從第幾個截取幾個。

實例方法:substring()

s.substring(start,end); 提取字符串中兩個指定的索引之間的字符冗美。

實例方法:toLowerCase()

s.toLowerCase(string); 把字符串轉(zhuǎn)換為小寫魔种。

實例方法:toUpperCase()

s.toUpperCase(string); 把字符串轉(zhuǎn)換為大寫。

實例方法:sub()

s.sub() 把字符串顯示為下標粉洼。

實例方法:sup

s.sup(); 把字符串顯示為下標节预。

實例方法:fontcolor()

s.fontcolor(); 使用指定的顏色來顯示字符串。

實例方法:fontsize()

s.fontsize(); 使用指定的尺寸來顯示字符串属韧。

實例方法:match()

s.match(); 找到一個或多個正則表達式的匹配安拟,返回一個數(shù)組對象,來存儲這個字符的信息宵喂。

實例方法:replace()

s.replace(); 替換與正則表達式相匹配的值糠赦。

實例方法:search()

s.search(); 檢索與正則表達式小匹配的值,返回字符索引锅棕。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拙泽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子裸燎,更是在濱河造成了極大的恐慌顾瞻,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件德绿,死亡現(xiàn)場離奇詭異荷荤,居然都是意外死亡退渗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門梅猿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氓辣,“玉大人,你說我怎么就攤上這事袱蚓〕ィ” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵喇潘,是天一觀的道長体斩。 經(jīng)常有香客問我,道長颖低,這世上最難降的妖魔是什么絮吵? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮忱屑,結(jié)果婚禮上蹬敲,老公的妹妹穿的比我還像新娘。我一直安慰自己莺戒,他們只是感情好伴嗡,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著从铲,像睡著了一般瘪校。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上名段,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天阱扬,我揣著相機與錄音,去河邊找鬼伸辟。 笑死麻惶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的信夫。 我是一名探鬼主播窃蹋,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼忙迁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碎乃,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤姊扔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后梅誓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恰梢,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡佛南,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嵌言。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗅回。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖摧茴,靈堂內(nèi)的尸體忽然破棺而出绵载,到底是詐尸還是另有隱情,我是刑警寧澤苛白,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布娃豹,位于F島的核電站,受9級特大地震影響购裙,放射性物質(zhì)發(fā)生泄漏懂版。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一躏率、第九天 我趴在偏房一處隱蔽的房頂上張望躯畴。 院中可真熱鬧,春花似錦薇芝、人聲如沸蓬抄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倡鲸。三九已至,卻和暖如春黄娘,著一層夾襖步出監(jiān)牢的瞬間峭状,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工逼争, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留优床,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓誓焦,卻偏偏與公主長得像胆敞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子杂伟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容