- 前言
- 关于 ECMASCRIPT 发展史和现状
- ES6 带来的重大特性
- ES2016(ES7)的改进
- ES2017(ES8)带来的重大新特性
- ES2018(ES9)带来的重大新特性
- JavaScript 编码风格指南
- JavaScript 词法结构(构建块)
- JavaScript 变量
- JavaScript 数据类型
- JavaScript 表达式
- 原型继承
- 如何使用 JavaScript 中的 Classes(类)
- JavaScript 异常处理
- JavaScript 中的分号(;)
- JavaScript 中的引号
- JavaScript 字面量模板(Template Literals)指南
- JavaScript 中的 function(函数)
- JavaScript 箭头函数(Arrow Function)
- JavaScript 中的闭包(Closures)
- JavaScript 数组(Arrays)
- JavaScript 中的循环(Loops)
- JavaScript 中的事件(Events)
- JavaScript 中的事件循环(Event Loop)
- JavaScript 异步编程和回调
- 理解 JavaScript 中的 Promises
- 用 async 和 await 编写现代 JavaScript 异步代码
- JavaScript 中的 循环(Loops) 和 作用域(Scope)
- JavaScript 定时器 setTimeout() 和 setInterval()
- JavaScript 中的 this
- JavaScript 严格模式(Strict Mode)
- JavaScript 中的 立即执行函数表达式(IIFE)
- JavaScript 中的数学运算符
- JavaScript 中的 Math 对象
- 介绍 ES Modules(模块)
- 介绍 CommonJS
- JavaScript 术语表
JavaScript 字面量模板(Template Literals)指南
在 ES2015(又名 ES6)中引入,字面量模板提供了一种声明字符串的新方法,但也提供了一些已经广泛流行的新有趣的结构。
字面量模板简介
字面量模板是 ES2015 / ES6 的新功能,与 ES5 及更低版本相比,它允许您以新颖的方式处理字符串。
乍一看语法非常简单,只需使用反引号而不是单引号或双引号:
const a_string = `something`
它们是独特的,因为它们提供了许多用引号构建的普通字符串所特有的特性:
- 它们提供了很好的语法来定义多行字符串
- 它们提供了一种在字符串中插入变量和表达式的简便方法
- 他们允许使用模板标签创建 DSL
让我们详细了解一下每个特性。
多行字符串
在 ES6 之前,要创建一个跨越两行的字符串,您必须在一行的末尾使用 \
字符:
const string = 'first line\n \ second line'
或者
const string = 'first line\n' + 'second line'
字面量模板使多行字符串更加简单。
使用反引号打开字面量模板后,只需按 Enter 键即可创建一个没有特殊字符的新行,并按原样渲染:
const string = `Hey this string is awesome!`
请记住,空格是有意义的,所以这样做:
const string = `First Second`
上面的代码将创建一个这样的字符串:
First Second
解决这个问题的一个简单方法是使第一行空掉,并在关闭反引号后立即跟随 trim()
方法,这将消除第一个字符前的任何空格:
const string = ` First Second`.trim()
插值
模板标签是一种乍听起来可能不太有用的特性,但实际上它被许多流行的库所使用,比如 Styled Components 或 Apollo ,GraphQL 客户端/服务器库,因此了解它是如何工作的必不可少。
在 Styled Components 模板标签中用于定义 CSS 字符串:
const Button = styled.button` font-size: 1.5em; background-color: black; color: white; `;
在 Apollo 中,模板标签用于定义 GraphQL 查询模式:
const query = gql` query { ... } `
这些示例中 styled.button
和 gql
模板标签只是 函数 :
function gql(literals, ...expressions) { }
这个函数返回一个字符串,这个字符串可以是任何类型计算的结果。
literals
是一个数组,包含由表达式插值标记的字面量模板内容。
expressions
包含所有插值。
如果我们举一个上面的例子:
const string = `something ${1 + 2 + 3}`
literals
是一个包含两个项的数组。 第一个是 something
,直到第一个插值的字符串,第二个是空字符串,第一个插值的结尾(我们只有一个)和字符串的结尾之间的空格。
在这种情况下, expressions
是一个包含单个项元素的数组, 6
。
一个更复杂的例子是:
const string = `something another ${'x'} new line ${1 + 2 + 3} test`
在这种情况下, literals
是一个数组,其中第一项是:
`something another `
第二个是:
` new line `
第三个是:
` test`
在这种情况下, expressions
是一个包含两个项 x
和 6
的数组。
传递这些值的函数可以用这些值做任何事情,这就是这种特性的强大之处。
最简单的例子是通过简单地连接 literals
和 expressions
来复制字符串插值的作用:
const interpolated = interpolate`I paid ${10}€`
这就是 interpolate
的工作原理:
function interpolate(literals, ...expressions) { let string = `` for (const [i, val] of expressions) { string += literals[i] + val } string += literals[literals.length - 1] return string }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论