KRy*_*yan 5 javascript templates
也就是说,我知道当你写 时tag`Foo ${\'bar\'}.`;,\xe2\x80\x99 只是tag([\'Foo \', \'.\'], \'bar\');.\xc2\xb9的语法糖
但只是呢\xe2\x80\x8b`Foo ${\'bar\'}.`;?我可以 \xe2\x80\x99t 只是 \xe2\x80\x9ccall\xe2\x80\x9d ([\'Foo \', \'.\'], \'bar\');。如果我已经有这种形式的参数,我应该将它们传递给什么函数?
我只对实现模板文字功能的本机函数感兴趣。我很有能力自己滚动,但这个问题的目的是避免这种情况并正确执行 \xe2\x80\x9cproperly\xe2\x80\x9d\xe2\x80\x94 即使我的实现与当前本机完美匹配功能,本机功能可能会发生变化,但我希望我的用法仍然匹配。因此,这个问题的答案应采用以下形式之一:
\n要使用的本机函数的名称,最好包含其文档的链接和/或引用。
\n规范的链接和/或引用精确定义了此函数的实现,因此,如果我自己推出,至少我可以确保它\xe2\x80\x99s 符合(当前)规范。
\n本机实现不可用且未指定的备份声明。理想情况下,这再次得到文档链接和/或引用的支持,但如果\xe2\x80\x99s不可用,我\xe2\x80\x99将接受支持此声明的其他来源或论证。
\nraw属性,因为它\xe2\x80\x99是一个TemplateStringsArray而不是常规数组,但我\xe2\x80\x99m在这里跳过它是为了使示例更具可读性。我正在尝试创建一个标签函数(tag例如),它在内部对输入执行默认模板文字连接。也就是说,我正在获取TemplateStringsArray和剩余的参数,并将它们转换为已经整理好模板的单个字符串。(这可能是为了将结果传递到另一个标记函数中,otherTag我希望第二个函数将所有内容视为单个字符串文字而不是破碎的模板。)
例如,tag`Something ${\'cooked\'}.`;相当于otherTag`Something cooked.`;.
的定义tag看起来像这样:
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}\nRun Code Online (Sandbox Code Playgroud)\n定义 的值raw相当简单:我知道这String.raw是我需要在此处调用的标记函数,因此const raw = [String.raw(textParts.raw, ...expressions)];.
但我在互联网上找不到任何地方我会调用cooked它的一部分的函数。我想要的是,如果我有tag`Something ${\'cooked\'}.`;,我想要const cooked = `Something ${cooked}.`;在我的函数中。但我无法\xe2\x80\x99找到完成该任务的任何函数的名称。
我发现的最接近的说法是它可以实现为
\nconst cooked = [expressions.map((exp, i) => textParts[i] + exp).join(\'\')];\nRun Code Online (Sandbox Code Playgroud)\n这是错误的\xe2\x80\x94textParts可能比 长expressions,因为tag`Something ${\'cooked\'}.`;gets[\'Something \', \'.\']和[\'cooked\']作为其参数。
改进这个表达式来处理\xe2\x80\x99t 不是一个问题:
\nconst cooked = [\n textParts\n .map((text, i) => (i > 0 ? expressions[i-1] : \'\') + text)\n .join(\'\'),\n];\nRun Code Online (Sandbox Code Playgroud)\n但这\xe2\x80\x99s不是重点\xe2\x80\x94我不想\xe2\x80\x99不想在这里推出我自己的并冒着与本机实现不一致的风险,特别是如果它发生变化。
\n