且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

延迟ES6模板文字的执行

更新时间:2022-05-30 22:53:17

我可以请参阅以下三种方式:

I can see three ways around this:


  • 使用设计为使用的模板字符串,而不需要任何格式 function:

  • Use template strings like they were designed to be used, without any format function:

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}`);
// or even function parameters for actual deferral of the evaluation:
const welcome = (p0, p1) => `Hello, ${p0}. This is a ${p1}`;
console.log(welcome("world", "test"));


  • 不要使用模板字符串,而是使用纯字符串文字:

  • Don't use a template string, but a plain string literal:

    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"));
    


  • 使用标记的模板文字。请注意,替换仍将被处理程序进行评估,而不会使用 p0 之类的标识符,而不使用名为so的变量。 如果不同的替代主体语法提案是,则此行为可能会更改接受(更新:不是)。

  • Use a tagged template literal. Notice that the substitutions will still be evaluated without interception by the handler, so you cannot use identifiers like p0 without having a variable named so. This behavior may change if a different substitution body syntax proposal is accepted (Update: it was not).

    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: ^               ^