模版字符串是es6引入的字符串操做規範,目的在於咱們能夠更加快速的書寫多行字符串,基本的字符格式化和HTML轉移等。html
用反撇號代 `
替單引號或者雙引號:git
const message = `string template`;
console.log(message);
複製代碼
多行字符串。在以前多行書寫的時候咱們會在每行末尾加上\
拼接字符串,或者要顯示換行的時候加上換行符號 \n
:es6
const msg = 'Hello \n\ word';
console.log(msg);
/* Hello world */
複製代碼
在模版字符串中咱們直接換行寫就能夠了,在反撇號中間的換行符和空白字符都會被保留:github
const msg = `Hello world`;
console.log(msg);
/* Hello world */
複製代碼
模版字符串用${js表達式}
的方式提供字符串佔位,大括號中間容許任意js表達式:數組
const name = 'wozien';
const msg = `Hello, I am ${name}`; // Hello, I am wozien
複製代碼
由於模版字符串也屬於js表達式,因此佔位符裏面容許嵌套模版字符串:app
const arr = [1, 2, 3];
const html = ` <ul> ${arr.map(val => `<li>${val}<li>`).join('')} </ul> `.trim();
console.log(html);
/* <ul> <li>1<li><li>2<li><li>3<li> </ul> */
複製代碼
上面的代碼在一個模版字符串的佔位符用 map
返回一個 li
字符串數組,最後 join
是由於模版字符串會轉化不是字符串類型的數據,好比[1,2,3]
顯示爲 1,2,3
。函數
模版字符串能夠在字符串前帶上一個函數名做爲標籤,表示對後面緊跟的字符串進行處理,返回處理後結果。工具
const name = 'wozien';
const age = 23;
const msg = tagFun`Hello, I am ${name}, my age is ${age}`;
function tagFun(literals, ...exps) {
console.log(literals); // [ 'Hello, I am ', ', my age is ', '' ]
console.log(exps); // [ 'wozien', 23 ]
}
複製代碼
可見,標籤函數的第一個參數是佔位符分割原字符串的數組結果,第二個參數是佔位符的返回值結果數組。因而咱們能夠利用這兩個數組進行拼接,模擬字符串模版的功能:post
function tagFun(literals, ...exps) {
return literals.reduce((pre, cur, i) => {
const value = exps[i - 1];
return pre + value + cur;
});
}
console.log(msg); // Hello, I am wozien, my age is 23
複製代碼
處理數組轉換。在前面 map
生成的li數組中咱們最後 join
了下,其實能夠放在標籤函數裏面處理:ui
function htmlTag(liters, ...exps) {
let result = liters.reduce((pre, cur, i) => {
let value = exps[i - 1];
if (Array.isArray(value)) {
value = value.join('');
}
return pre + value + cur;
});
return result.trim();
}
const arr = [1, 2, 3];
const html = htmlTag` <ul> ${arr.map(val => `<li>${val}<li>`)} </ul>`;
console.log(html);
複製代碼
有時候咱們爲了書寫好看把字符串換行寫,但實際是輸出顯示一行,咱們能夠寫一個oneLine標籤函數:
function oneLine(liters, ...exps) {
let result = liters.reduce((pre, cur, i) => {
let value = exps[i - 1];
return pre + value + cur;
});
// 正則替換掉每行前面的空字符
result = result.replace(/(\n\s)*/g, '');
return result.trim();
}
const fruits = oneLine` apple, peal, banane `;
console.log(fruits); // apple, peal, banane
複製代碼
在咱們開發中,咱們能夠把標籤函數封裝起來,根據配置作不一樣的字符串處理。相似的工具包有common-tags。