模板字符串
ES6 引入了一个新特性:模板字符串,模板字符串使用反引号 ` 而不是 " 或 ' 包裹。
字符串插值
模板字符串的最简形态就是普通字符串:
const str = `hello world`
使用模板字符串可以轻松地进行字符串插值:
const price = 150
// 普通字符串插值
const str1 = 'This commodity costs about ' + price + '$.'
// 模板字符串插值
const str2 = `This commodity costs about ${price}$.`
使用模板字符串插值既可以提高字符串整体的可读性,又可以减少在拼接多个字符串和变量时容易产生的错误。
模板替换中的代码可以是任何 JavaScript 表达式,因此允许函数调用、算术等。
const price = 150
// 算术
const str1 = `This commodity costs about ${price * 100}cent.`
// 函数
const str2 = `This commodity costs about ${(() => price * 100)()}cent.`
嵌套模板
如果你真的想要,你甚至可以在另一个模板字符串中嵌套一个模板字符串:
const price = 150
const unit = 'cent'
const str1 = `This commodity costs about ${unit === 'cent' ? `${price * 100}cent` : `${price}$`}`
多行字符串
在新行中插入的任何字符都是模板字符串中的一部分。
比如你想创建一段 HTML 代码:
const htmlStr = `
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
`
所有的回车,空格等字符都会保留在字符串中。
Notice
上面这样创建出来的字符串前后都会包含回车符 \n
,因此可以调用字符串的 trim
方法去掉前后的回车。
标签模板
更高级的形式的模板字符串是带标签的模板字符串。标签使您可以用函数解析模板字符串。标签函数的第一个参数包含一个字符串值的数组。其余的参数与表达式相关。
const func = (a, b, c) => {
console.log(a)
console.log(b)
console.log(c)
}
const commodity = 'wallet'
const price = 150
func`This ${commodity} costs about ${price}$.`
输出如下:
["This ", " costs about ", "$.", raw: Array(3)]
"wallet"
150
func
收到的第一个参数是模板字符串剔除插值之后分割成的字符串数组,数组中包含一个 raw
属性,里面包含这些字符串的原始字符串(转义之前)。
ES6 提供了 String.raw()
方法让我们获取原始字符串。
let s = String.raw`xy\n${1 + 1}z`
console.log(s) // "xy\\n2z"