为什么数组函数像标记的模板文字一样工作,我可以用它做什么?

Why do array functions work like tagged template literals and what can I do with it?

最近我发现这个很管用:

const str = "foo bar";
const arr = str.split` `; // <- no parens
console.log(arr);
// -> ["foo", "bar"]

split 原型似乎是一个带标签的模板文字。我还看到它与其他数组函数一起使用,例如 indexOf.

实施此行为是否有特定原因? 我可以用它做一些我以前做不到的事情吗?或者我可以用 更简单 的方式解决一些任务吗?

似乎在实现上付出了一些努力,我能想到的每一个用例都会让事情变得过于复杂。在我看来,让它成为可能是在浪费时间。还是零成本?如果是这样:如何?

.split 方法并没有什么特别之处,这就是标记模板文字的工作方式。您可以使用 any 函数标记模板文字,它将作为第一个参数给出插值块之外的模板字符串部分。对于这种情况,数组 [" "] 然后用作 .split 的第一个参数(之后点 [" "] 被转换为字符串:" ")。

您可以调用任何函数,将其用作模板标签。

模板标签函数接收以下参数:

  1. 静态字符串部分数组
  2. 无穷大。 替换值

那么,您的电话将转接到:

const arr = str.split([' ']);

String#split() 期望它的第一个参数是字符串或正则表达式。数组不是这些,因此 .split() 通过调用其 .toString() 方法将其转换为字符串。

Array#toString() returns 数组的元素以逗号分隔。如果是单个元素,它 returns 将元素转换为字符串。

因为' '已经是一个字符串,它被返回,并被.split()用于分割输入字符串。


尽管在某些情况下可以像那样工作,但不鼓励这种用法(使用不是为此设计的函数作为标记函数),因为它不可读,性能较差(创建额外的数组等)并且只保存 2 个字符(` ` 而不是 (' ')),但是,它被一些压缩器和混淆器使用。

String.prototype.split 实际上并不是为使用标记的模板文字而设计的。

当您使用标记模板调用 split 时,传递给该函数的第一个参数是模板中的字符串数组,因此

str.split` `;

相当于

str.split([" "]);

。该数组只有一个字符串,没有更多的参数,因为模板文字中没有占位符(${})。

规范说 split 方法首先将第一个参数转换为字符串,然后使用它,所以

str.split([" "]);

相当于

str.split(" ");

.