5

我最近了解到 ES6 允许在使用模板文字作为参数时进行不带括号的函数调用。例如

showstring`Hello World`;

然而,在阅读了几篇关于这个功能的文章之后,我发现关于 JS 如何处理这些调用背后的逻辑的信息很少。

在玩弄了我的代码的一些排列之后,我仍然在努力拼凑模板文字如何在函数内部被分解的模式,当人们以这种方式调用它时。

const showstring = (str) => {
  console.log(str);
}
showstring`Hello World`;

上面代码中发生的事情很简单,字符串文字作为数组接收,其中第一个也是唯一的元素是字符串。

一旦我开始在模板中使用表达式,它就会变得有点混乱。例如

const showstring = (str, ...values) => {
  console.log(str);
  console.log(values)
}
const name = 'John'
showstring`Hello World ${name} ${name} ${1 + 2} and more`;

所以看起来这...values部分解构了所有的表达式。但是,为什么str数组在这些位置有空字符串呢?

我只是没有完全掌握它遵循的模式。有人可以解释这个功能吗?或者也许给我指出一篇好文章?

4

1 回答 1

6

在第二个代码片段中,记录了以下内容:

// str
[
  "Hello World ",
  " ",
  " ",
  " and more"
]

// values
[
  "John",
  "John",
  3
]

如果这些“空字符串”是指数str组的第 2 项和第 3 项,则它们不是空字符串;它们是带有单个空格的字符串。它们来自模板文字中表达式之间的空格:

showstring`Hello World ${name} ${name} ${1 + 2} and more`;
//                            ^       ^

当模板文字前面有一个表达式时——在这种情况下showstring——它被称为标记模板

在您的showstring函数中,始终包含比数组str多一项。values例如看看这些日志:

const showstring = (str, ...values) => {
  console.log(str);
  console.log(values)
}
const name = 'John'
showstring``;
showstring`${name}`;
showstring`Hello ${name}!`;

这不是特定于您的功能;这就是标记模板的工作方式。来自不耐烦程序员的 JavaScript(ES2020 版)一书的标记模板部分

第一个反引号之前的函数称为标记函数。它的论点是:

  • 模板字符串(第一个参数):一个数组,其中包含插值周围的文本片段${}
  • Substitutions(剩余参数):插值。

关于您的评论:

不过有趣的是,无论您在调用函数时在表达式之间放置了多少空格,该单个空格都将始终保持为单个空格。知道为什么它只修剪一个空间吗?

情况似乎并非如此。这会记录一个包含三个空格的字符串:

const showstring = (str, ...values) => {
  console.log(str);
  console.log(values)
}
const name = 'John'
showstring`Hello ${name}   ${name}!`;

您是否可能将结果打印到 DOM?除非您使用<pre>orwhite-space: pre;或类似的东西,否则多个空格仅显示为一个,因此结果似乎被修剪为仅一个空格。

于 2021-01-16T07:51:19.880 回答