此篇會介紹 ES6 新增的「板字面值 Template Literal」。
樣板字面值 Template Literal
MDN:用來進行多行字串、字串串接以及字串插補(string interpolation),在先前
的版本 ES2015 中被稱為「樣板字串(template strings)」。
語法:
`string text ${expression} string text` |
兩個反引號``
並加上 ${expression}
來插入變數、表達式。
1 | let s = '我'; |
Tips
- 反引號的內容會保留所有的
換行
和空白
。 - 不能插入陳述式,否則會噴 Error。
1 | console.log(`我是誰 ,\n 我在哪裡`); |
Q:那為什麼會需要樣板字面值?其它方式不行嗎?
A:可以,但樣板字面值簡化串接過程
,使串接變得更容易簡潔
。
下面會透過幾個範例,來演示舊字串串接、樣板字面值兩者在不同情境的差別。
語法差異
舊字串串接:會使用單引號
或雙引號
來包裹字串
,再透過 +
的方式來串接。
樣板字面值:兩個反引號 `` 並加上 ${expression}
來插入變數、表達式。
1 | let str1 = '世界'; |
多行串接
1 | let money = 10; |
跳脫字元
Q:那如果需要將反引號作為字串怎麼辦?
A:可以使用跳脫字元。
1 | // 在字元前面加上反斜線(backslash) |
複雜用法
上面範例中已充分暸解如何使用樣板字面值,來做字串串接和字串插補,下方在用一個範例來演示,結合函式、判斷式、巢狀的應用。
1 | let moneys = [10, 0]; |
不敢想像用傳統串接寫的話會變成什麼樣子 QQ
標籤樣板字面值 Tagged Template Literals
MDN:屬於樣板字面值的進階用法,常用於函式參數傳入。
語法:
- 函式後方將括號替代為樣板字面值
1 | // 一般函式參數 |
如果樣板字面值中沒有使用到 ${}
,那和一般函式呼叫帶入的參數沒什麼差異,那看起來也沒多厲害?不不不精彩的正要開始。
樣板字面值傳參數特性
- 將樣板字面值內容中含有
${}
切為多個參數
,將其組成一個陣列傳入函式中。
參數格式
- 第一個參數(陣列):除了
${}
之外的內容。- 從
${}
位置切割,並會以字串型態存入陣列中。 - 要注意就算
${}
後面沒有其他字串,但還是會有一個空字串存入陣列中
- 從
- 第二個參數:第一個
${}
- 第三個參數:第二個
${}
(…依此類推下去)
${} 後面沒有其他字串,但還是會有一個空字串存入陣列中。
例如:一個 ${} 會切兩個字串,兩個 ${} 會切三個字串。
1 | let str1 = '標籤'; |
變數的部分,也可以使用其餘運算子
來一次接收全部變數。
1 | let str1 = '標籤'; |
通常 ${}
數量是不固定的,因此可以使用其餘運算子將 ${}
的參數組成陣列來使用。
1 | let str1 = '標籤樣板字面值'; |
要注意第一個參數永遠只會傳入非 ${}
的字串,所以請不要在第一個參數使用其餘參數,因為沒有必要。
標籤樣板字面值也常用來預防 XSS 攻擊,請看下方範例。
- 透過將
${}
內容中含有<
、>
與&
的符號替換成 ASCII Code,也就是單純的字串。
1 | function convertHTML (strings, ...keys) { |