【问题标题】:Tag for generic template literal function in javascript [duplicate]javascript中通用模板文字函数的标签[重复]
【发布时间】:2020-10-11 17:10:13
【问题描述】:

我的目标是编写一个标记模板函数,例如

myTemplateTagFunction`some text ${variable} etc. etc.`

...其行为类似于 javascript 中的默认模板文字函数。

我的第一次尝试是

let myTaggedTemplate = args => `${args}`

但这很快就坏了……

> myTaggedTemplate`hello world ${2 + 5}`
// "hello world ,"

> `hello world ${2 + 5}`
// "hello world 7"

一定有一种我想念的更简单的方法吗?

【问题讨论】:

  • 使用 默认模板文字函数,您的意思是模板文字在没有被标记的情况下会如何表现?
  • 带标签的模板不起作用。您是否查看过(例如)MDN 上的文档以了解参数实际上是传递给标记模板函数的吗?
  • @Quentin 我查看了文档,这就是为什么我第一次尝试将传入的参数传递回模板文字函数的原因。如果您对它们非常了解,请为回答这个问题提供您的理解
  • @rob-gordon — 问题的前提并没有真正的意义。我可以想出一个解决方案(就像彼得一样),但坦率地说,这是愚蠢的。如果您想要那种效果,只需使用模板文字即可。
  • @Quentin 如果你想知道我为什么要问,那就问我为什么问。如果你想嘲笑这个问题而不是审问,那就是你了

标签: javascript template-literals tagged-templates


【解决方案1】:

也许有更短的方法,但这是我的方法:

const myTaggedTemplate = (strings, ...vars) => {
    let result = '';
    strings.forEach((str, i) => {
        result += `${str}${i === strings.length - 1 ? '' : vars[i]}`;
    });
    return result;
};

【讨论】:

  • === undefined 支票是怎么回事?这不是普通模板字符串的工作方式。
  • 字符串数组可能比 vars 数组长,所以对于最后一个索引 vars[i] 将是未定义的
  • 感谢编辑,这样更好。
【解决方案2】:

如何定义标记模板函数

如果你定义一个标记模板函数,它必须接收一个字符串数组作为第一个参数,并接收任意数量的表达式作为后续参数。字符串都是您插入的表达式之间的字符串(所有${...} 之间),所有表达式都是您放入${...} 的值。

示例代码

let numExp = 2;

function tagFunction(strings, ...expressions) {
  let returnString = "";
  for (let i = 0; i < expressions.length; i++) {
    returnString += strings[i] + expressions[i];
  }
  returnString += strings[strings.length - 1];
  return returnString;
}

console.log(
  tagFunction`Using function \"${tagFunction.name}\" with ${numExp} expressions`
);

【讨论】:

    【解决方案3】:

    你需要改变你的功能:

    let myTaggedTemplate = (strings,...values) => ...;
    

    并尝试按照this link中的示例进行操作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-25
      • 2015-08-25
      • 1970-01-01
      • 2013-04-03
      • 2018-08-24
      • 1970-01-01
      • 2017-10-26
      • 2010-10-25
      相关资源
      最近更新 更多