为什么数组函数像标记的模板文字一样工作,我可以用它做什么?
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
的第一个参数(之后点 [" "]
被转换为字符串:" "
)。
您可以调用任何函数,将其用作模板标签。
模板标签函数接收以下参数:
- 静态字符串部分数组
- 到无穷大。 替换值
那么,您的电话将转接到:
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(" ");
.
最近我发现这个很管用:
const str = "foo bar";
const arr = str.split` `; // <- no parens
console.log(arr);
// -> ["foo", "bar"]
split
原型似乎是一个带标签的模板文字。我还看到它与其他数组函数一起使用,例如 indexOf
.
实施此行为是否有特定原因? 我可以用它做一些我以前做不到的事情吗?或者我可以用 更简单 的方式解决一些任务吗?
似乎在实现上付出了一些努力,我能想到的每一个用例都会让事情变得过于复杂。在我看来,让它成为可能是在浪费时间。还是零成本?如果是这样:如何?
.split
方法并没有什么特别之处,这就是标记模板文字的工作方式。您可以使用 any 函数标记模板文字,它将作为第一个参数给出插值块之外的模板字符串部分。对于这种情况,数组 [" "]
然后用作 .split
的第一个参数(之后点 [" "]
被转换为字符串:" "
)。
您可以调用任何函数,将其用作模板标签。
模板标签函数接收以下参数:
- 静态字符串部分数组
- 到无穷大。 替换值
那么,您的电话将转接到:
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(" ");
.