JavaScript ES6 Template Literals 字串樣版
ES6 引入了 Template Literals (字串樣版) 是增強版的字串表示法,Template Literals 讓你可以寫多行字串 (multi-line strings)、也可以在字串中插入變數或 JavaScript 表達式 (String/Expression interpolation)。
Template Literals 的語法是用兩個反引號 (back-tick) ` `
標示,而在字串中可以使用 ${ }
語法來嵌入變數或 JavaScript 表達式。
多行字串 Multi-line Strings
傳統的寫法:
var str = 'string text line 1\n' +
'string text line 2'
Template Literals 新的寫法:
var str = `string text line 1
string text line 2`
嵌入變數或任何表達式 String/Expression Interpolation
傳統的寫法:
var a = 5;
var b = 10;
console.log('Fifteen is ' + (a + b) + ' and\nnot ' + (2 * a + b) + '.');
Template Literals 新的寫法:
var a = 5;
var b = 10;
console.log(`Fifteen is ${a + b} and
not ${2 * a + b}.`);
${}
中可以是任何 JavaScript expression,例如執行一個函數:
function fn() {
return 'Hello World';
}
// foo Hello World bar
var str = `foo ${fn()} bar`;
樣板標籤 Tagged Template Literals
Template Literals 可以接在一個函數名稱後面,該函數會被用來處理字串樣版,這功能叫做樣板標籤 (Tagged Template)。
如果字串中沒有使用 ${}
就跟執行一般函數類似,執行函數時,會傳入一個陣列型態的參數,陣列中只有一個元素就是字串本身:
alert`123`;
// 等同於執行
alert(['123']);
如果字串中有使用 ${},會將字串樣版的內容切分成多個參數,切法是先根據 ${} 的位置,將沒有在 ${} 中的內容切開成多個字串組成一個陣列 (array),當作函數的第一個參數,接著將每個 ${} 中的值,依序當作第二個、第三個、...第 N 個參數:
var person = 'Mike';
var age = 28;
function myTag(strings, personExp, ageExp) {
// 首先依 ${} 的位置將原始字串切成一個字串陣列,得到 strings
// ["that ", " is a ", ""]
//
// 為什麼最後有一個 ""
// 因為我們有一個 ${} 的位置在字串結尾
// ${ person } 的值會被當作第二個參數傳入
// ${ age } 的值會被當作第三個參數傳入
// "that "
var str0 = strings[0];
// " is a "
var str1 = strings[1];
var ageStr;
if (ageExp > 99) {
ageStr = 'centenarian';
} else {
ageStr = 'youngster';
}
// ${ person } 的值會被當作第二個參數傳入
return str0 + personExp + str1 + ageStr;
}
var output = myTag`that ${ person } is a ${ age }`;
// 顯示 that Mike is a youngster
console.log(output);
IE 最新版瀏覽器 IE11 目前還不支援 Template Literals。