JavaScript 的模板字符串

d4ee02a931afe7af10bb656ed19ff649.png

字符串插值

JavaScript 中使用反引号 ` 包裹的字符串叫模板字符串(template literals)。人们常用它拼接变量和字符串,即所谓的字符串插值(string interpolation)。在使用字符串插值时,使用 ${} 包裹变量或表达式,它是变量的占位符。

69cfb8f0c0249e7a5e8e193cb7e1f574.png

多行文本

模板字符串支持多行文本(multi-line strings)。

7c640380966b6973bde44be7fd86410f.png

4f51abcae86c47d086356693d4b37753.png

嵌套模板

它还支持嵌套模板(nesting templates)。即在一个模板字符串的变量内,使用另一个模板字符串。

ed128c69c5e3783a8ae32e315d582d64.png

63d8cc60adecbd224331e821f3d3afe1.png

带标签的模板

它还有另外一个略显高级的用法:带标签的模板(tagged templates),有时也叫标签函数(tag function),指的都是一回事。

在带标签的模板中,标签其实是一个函数,它可以处理模板字符串的内容。该函数的第一个参数是字符串数组,包括模板字符串的所有静态字符字面量,后面的不定参数,按照先后顺序分别对应 ${} 对应的变量。

函数返回值会当作模板字符串变量的最终值。只要你想,返回值可以和入参完全无关。

a50ff96b09fca0252b1d90e2e06de41d.png

46245359d350ca77eea1c4d7073386be.png

标签函数属于可变参数函数(variadic functions),在 JavaScript 中可以使用三个点 ... 剩余参数(rest parameters)语法,将所有的变量收集到一个数组。

标签函数的返回值可以是任意类型,不一定是字符串。

cd3a785e79f7aa2f9a103f01b01fb0ad.png

除了普通变量,带标签模板的“标签”还可以是表达式,只要它的操作符优先级大于 16 即可。满足条件的表达式有属性访问 x.y、函数调用 x(y)、创建对象 new x(y),甚至另一个标签模板字面量

44b4867af4eed22a49fce1a39c76cf1f.png

ed2e39413fae85f4e4a5fb1b51d85fb7.png

4c6bb5e46b5cbbc5e2a6679f7e030df9.png

带标签模板的实际应用有哪些?如果你接触过谷歌的 zx 命令行工具,或者谷歌的 Lit 框架(谷歌真喜欢用它),就会见到它的实际用法。下图中的 $ 和 html 就是标签函数。

aa8cea55c5a1388e3780cdc8f8683324.png

381d754e558164556bb5b1600c5853cd.png

参考资料

Tagged templates

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#tagged_templates

google/zx

https://github.com/google/zx

Lit

https://lit.dev/

Rest parameters

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters

Operator precedence

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_precedence#table

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值