当前位置: 首页 > 知识库问答 >
问题:

推迟ES6模板文字的执行

李良策
2023-03-14

我正在玩新的ES6模板文字功能,我首先想到的是一个<code>字符串。为JavaScript格式化,所以我开始实现一个原型:

String.prototype.format = function() {
  var self = this;
  arguments.forEach(function(val,idx) {
    self["p"+idx] = val;
  });
  return this.toString();
};
console.log(`Hello, ${p0}. This is a ${p1}`.format("world", "test"));

ES6Fiddle

但是,模板文字在传递给我的原型方法之前会被评估。有没有什么方法可以编写上面的代码来将结果推迟到我动态创建元素之后?

共有3个答案

缪阎宝
2023-03-14

AFAIS的有用功能“字符串模板的延迟执行”仍然不可用。然而,使用lambda是一种富有表现力、可读性和简短的解决方案

var greetingTmpl = (...p)=>`Hello, ${p[0]}. This is a ${p[1]}`;

console.log( greetingTmpl("world","test") );
console.log( greetingTmpl("@CodingIntrigue","try") );
陆俭
2023-03-14

扩展@Bergi的答案,当你意识到你可以返回任何结果,而不仅仅是普通的字符串时,带标签的模板字符串的力量就显现出来了。在他的例子中,标签用闭包和函数属性< code>format构造并返回一个对象。

在我最喜欢的方法中,我自己返回一个函数值,您可以稍后调用它并传递新参数来填充模板。这样地:

function fmt([fisrt, ...rest], ...tags) {
  return values => rest.reduce((acc, curr, i) => {
    return acc + values[tags[i]] + curr;
  }, fisrt);
}

或者,对于代码高尔夫球手:

let fmt=([f,...r],...t)=>v=>r.reduce((a,c,i)=>a+v[t[i]]+c,f)

然后,构建模板并推迟替换:

> fmt`Test with ${0}, ${1}, ${2} and ${0} again`(['A', 'B', 'C']);
// 'Test with A, B, C and A again'
> template = fmt`Test with ${'foo'}, ${'bar'}, ${'baz'} and ${'foo'} again`
> template({ foo:'FOO', bar:'BAR' })
// 'Test with FOO, BAR, undefined and FOO again'

另一个选项,更接近您所写的内容,是返回从字符串扩展的对象,让duck键入出框并尊重接口。<code>字符串的扩展。prototype</code>将无法工作,因为您需要关闭模板标记才能稍后解析参数。

class FormatString extends String {
  // Some other custom extensions that don't need the template closure
}

function fmt([fisrt, ...rest], ...tags) {
  const str = new FormatString(rest.reduce((acc, curr, i) => `${acc}\${${tags[i]}}${curr}`, fisrt));
  str.format = values => rest.reduce((acc, curr, i) => {
    return acc + values[tags[i]] + curr;
  }, fisrt);
  return str;
}

然后,在呼叫站点中:

> console.log(fmt`Hello, ${0}. This is a ${1}.`.format(["world", "test"]));
// Hello, world. This is a test.
> template = fmt`Hello, ${'foo'}. This is a ${'bar'}.`
> console.log(template)
// { [String: 'Hello, ${foo}. This is a ${bar}.'] format: [Function] }
> console.log(template.format({ foo: true, bar: null }))
// Hello, true. This is a null.

您可以在其他答案中参考更多信息和应用html" target="_blank">程序。

左翰海
2023-03-14

我认为有三种方法可以解决这个问题:

>

  • 使用模板字符串,就像设计用来使用的一样,没有任何格式函数:

    console.log(`Hello, ${"world"}. This is a ${"test"}`);
    // might make more sense with variables:
    var p0 = "world", p1 = "test";
    console.log(`Hello, ${p0}. This is a ${p1}`);
    

    或者甚至是用于实际推迟评估的函数参数:

    const welcome = (p0, p1) => `Hello, ${p0}. This is a ${p1}`;
    console.log(welcome("world", "test"));
    

    不要使用模板字符串,而是使用普通的字符串文字:

    String.prototype.format = function() {
        var args = arguments;
        return this.replace(/\$\{p(\d)\}/g, function(match, id) {
            return args[id];
        });
    };
    console.log("Hello, ${p0}. This is a ${p1}".format("world", "test"));
    

    使用带标签的模板文本。请注意,处理程序仍然会在不拦截的情况下对替换进行计算,因此如果没有名为so的变量,就不能使用像< code>p0这样的标识符。< s >如果接受不同的替换体语法建议,此行为可能会改变(更新:它不是)。

    function formatter(literals, ...substitutions) {
        return {
            format: function() {
                var out = [];
                for(var i=0, k=0; i < literals.length; i++) {
                    out[k++] = literals[i];
                    out[k++] = arguments[substitutions[i]];
                }
                out[k] = literals[i];
                return out.join("");
            }
        };
    }
    console.log(formatter`Hello, ${0}. This is a ${1}`.format("world", "test"));
    // Notice the number literals: ^               ^
    

  •  类似资料:
    • 问题内容: 我正在使用新的ES6模板文字功能,想到的第一件事是JavaScript,因此我着手实现了一个原型: 但是,在将模板文字传递给我的原型方法之前,需要先对其进行评估。有什么方法可以编写上述代码以将结果推迟到动态创建元素之后? 问题答案: 我可以看到三种解决方法: 使用模板字符串,就像设计使用的那样,没有任何功能: // might make more sense with variable

    • 主要内容:1.多行字符串,2.字符串插值,3.标记模板,4.原始字符串,5.String.fromCodePoint()模板文字是ECMAScript 2015/ES6中引入的新功能。它提供了创建多行字符串和执行字符串插值的简便方法。模板文字是字符串文字,并允许嵌入表达式。 在ES6之前,模板文字被称为模板字符串。 与字符串中的引号不同,模板文字用反引号()字符(QWERTY键盘中ESC键下方的键)括起来。 模板文字可以包含占位符,由美元符号和大括号表示。在反引号内,如果要使用表达式,则可以将该

    • ES6引入了一种通过反引号( ` )标记的新的字符串文字类型。 这些字符串文字可以包括换行符,并且有一个新的机制用于将变量插入字符串:

    • 问题内容: 我有以下Ecma-Script-6代码 输出如下: 和 我已经能够在此处将字符串串联起来,那么使用模板文字的情形将是什么? 问题答案: 如果像问题示例中那样仅将模板文字与占位符(例如)一起使用,则结果与串联字符串相同。从主观上讲,它看起来更好并且更易于阅读,尤其是对于多行字符串或包含这两者的字符串,因为您不必再​​转义那些字符了。 可读性是一个很棒的功能,但是关于模板最有趣的是Tagg

    • 问题内容: 我想尝试使用模板文字,但它不起作用:它显示文字变量名称,而不是值。我正在使用Chromev50.0.2(和jQuery)。 例: 输出: 问题答案: JavaScript 模板文字 需要反引号,而不是直接引号。 您需要使用反引号(也称为“重音符”-您会在1键旁边找到)-而不是单引号-来创建模板文字。 反引号在许多编程语言中都很常见,但可能对JavaScript开发人员来说是新的。 范例

    • 我在开发airbnb风格指南时使用了eslint。我收到eslint错误建议使用模板文字而不是字符串连接(首选模板)。 它将此行标记为错误 <代码>': 这是我的密码 我的问题是使用三元运算符应用模板文字的推荐方法是什么?我在函数返回中应用了它,但根据我在此行上应用模板文字的位置会导致错误。理想情况下,我尝试执行整行操作,但是尝试将 传递给