模板文字的默认“标签”功能是什么?

KRy*_*yan 5 javascript templates

处理模板文字的本机函数的名称是什么?

\n

也就是说,我知道当你写 时tag`Foo ${\'bar\'}.`;,\xe2\x80\x99 只是tag([\'Foo \', \'.\'], \'bar\');.\xc2\xb9的语法糖

\n

但只是呢\xe2\x80\x8b`Foo ${\'bar\'}.`;?我可以 \xe2\x80\x99t 只是 \xe2\x80\x9ccall\xe2\x80\x9d ([\'Foo \', \'.\'], \'bar\');。如果我已经有这种形式的参数,我应该将它们传递给什么函数?

\n

我只对实现模板文字功能的本机函数感兴趣。我很有能力自己滚动,但这个问题的目的是避免这种情况并正确执行 \xe2\x80\x9cproperly\xe2\x80\x9d\xe2\x80\x94 即使我的实现与当前本机完美匹配功能,本机功能可能会发生变化,但我希望我的用法仍然匹配。因此,这个问题的答案应采用以下形式之一:

\n
    \n
  1. 要使用的本机函数的名称,最好包含其文档的链接和/或引用。

    \n
  2. \n
  3. 规范的链接和/或引用精确定义了此函数的实现,因此,如果我自己推出,至少我可以确保它\xe2\x80\x99s 符合(当前)规范。

    \n
  4. \n
  5. 本机实现不可用且未指定的备份声明。理想情况下,这再次得到文档链接和/或引用的支持,但如果\xe2\x80\x99s不可用,我\xe2\x80\x99将接受支持此声明的其他来源或论证。

    \n
  6. \n
\n
\n
    \n
  1. 实际上,第一个参数需要一个raw属性,因为它\xe2\x80\x99是一个TemplateStringsArray而不是常规数组,但我\xe2\x80\x99m在这里跳过它是为了使示例更具可读性。
  2. \n
\n
\n

动机

\n

我正在尝试创建一个标签函数(tag例如),它在内部对输入执行默认模板文字连接。也就是说,我正在获取TemplateStringsArray和剩余的参数,并将它们转换为已经整理好模板的单个字符串。(这可能是为了将结果传递到另一个标记函数中,otherTag我希望第二个函数将所有内容视为单个字符串文字而不是破碎的模板。)

\n

例如,tag`Something ${\'cooked\'}.`;相当于otherTag`Something cooked.`;.

\n

我目前的做法

\n

的定义tag看起来像这样:

\n
function tag(textParts, ...expressions) {\n  const cooked = // an array with a single string value\n  const raw = // an array with a single string value\n  return otherTag({ ...cooked, raw });\n}\n
Run Code Online (Sandbox Code Playgroud)\n

定义 的值raw相当简单:我知道这String.raw是我需要在此处调用的标记函数,因此const raw = [String.raw(textParts.raw, ...expressions)];.

\n

但我在互联网上找不到任何地方我会调用cooked它的一部分的函数。我想要的是,如果我有tag`Something ${\'cooked\'}.`;,我想要const cooked = `Something ${cooked}.`;在我的函数中。但我无法\xe2\x80\x99找到完成该任务的任何函数的名称。

\n

我发现的最接近的说法是它可以实现为

\n
const cooked = [expressions.map((exp, i) => textParts[i] + exp).join(\'\')];\n
Run Code Online (Sandbox Code Playgroud)\n

这是错误的\xe2\x80\x94textParts可能比 长expressions,因为tag`Something ${\'cooked\'}.`;gets[\'Something \', \'.\'][\'cooked\']作为其参数。

\n

改进这个表达式来处理\xe2\x80\x99t 不是一个问题:

\n
const cooked = [\n  textParts\n    .map((text, i) => (i > 0 ? expressions[i-1] : \'\') + text)\n    .join(\'\'),\n];\n
Run Code Online (Sandbox Code Playgroud)\n

但这\xe2\x80\x99s不是重点\xe2\x80\x94我不想\xe2\x80\x99不想在这里推出我自己的并冒着与本机实现不一致的风险,特别是如果它发生变化。

\n

Que*_*tin 0

\n

要使用的本机函数的名称,最好包含其文档的链接和/或引用。

\n
\n

没有一个。它是语法,而不是函数。

\n
\n

规范的链接和/或引用精确定义了此函数的实现,因此,如果我自己推出,至少我可以确保它\xe2\x80\x99s 符合(当前)规范。

\n
\n

规范的第 13.2.8节“模板文字”解释了如何处理语法。

\n