template strings loop for es6 concatenar javascript ecmascript-6 template-literals

strings - template string javascript



Aplazar ejecuciĆ³n para Literales de plantilla de ES6 (2)

Estoy jugando con la nueva característica ES6 Template Literals y lo primero que se me vino a la cabeza fue un String.format para Javascript, así que me puse a implementar un prototipo:

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

Sin embargo, el Literal de plantilla se evalúa antes de pasarlo a mi método de prototipo. ¿Hay alguna manera de que pueda escribir el código anterior para diferir el resultado hasta después de haber creado dinámicamente los elementos?


Publiqué una respuesta a una pregunta similar que ofrece dos enfoques en los que se retrasa la ejecución del literal de la plantilla. Cuando el literal de la plantilla está en una función, el literal de la plantilla solo se evalúa cuando se llama a la función, y se evalúa utilizando el alcance de la función.

https://.com/a/49539260/188963


Puedo ver tres formas de evitar esto:

  • Utilice cadenas de plantillas como fueron diseñadas para ser utilizadas, sin ninguna función de format :

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

  • No use una cadena de plantilla, sino una cadena simple 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"));

  • Use una plantilla etiquetada literal. Tenga en cuenta que las sustituciones aún se evaluarán sin intercepción por el controlador, por lo que no puede usar identificadores como p0 sin tener una variable llamada así. Este comportamiento puede cambiar si se acepta una propuesta de sintaxis de cuerpo de sustitución diferente (Actualización: no fue así).

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