No estoy seguro de cómo explicar esto, pero cuando corro
console.log`1`En Google Chrome, obtengo un resultado como
console.log`1` VM12380:2 ["1", raw: Array[1]] ¿Por qué el acento grave llama a la función de registro y por qué crea un índice de raw: Array[1] ?
Pregunta planteada en la sala de JS por Catgocat, pero ninguna respuesta tenía sentido, además de algo sobre cadenas de plantillas que realmente no encajaban por qué sucede esto.
Se llama Plantilla etiquetada en ES-6 Se puede leer más sobre ellos Aquí , divertido, encontré el enlace en la sección destacada del mismo chat.
Pero la parte relevante del código está debajo (básicamente puede crear una ordenación filtrada).
function tag(strings, ...values) { assert(strings[0] === 'a'); assert(strings[1] === 'b'); assert(values[0] === 42); return 'whatever'; } tag `a${ 42 }b` // "whatever"Básicamente, simplemente está etiquetando el "1" con la función console.log, como lo haría con cualquier otra función. Las funciones de etiquetado aceptan valores analizados de cadenas de plantilla y los valores por separado sobre los que se pueden realizar otras tareas.
Babel transpila el código anterior para
var _taggedTemplateLiteralLoose = function (strings, raw) { strings.raw = raw; return strings; }; console.log(_taggedTemplateLiteralLoose(["1"], ["1"]));Como puede ver en el ejemplo anterior, después de ser transpilado por babel, la función de etiquetado (console.log) recibe el valor de retorno del siguiente código transpilado es6->5.
_taggedTemplateLiteralLoose( ["1"], ["1"] );El valor de retorno de esta función se pasa a console.log, que luego imprimirá la matriz.
La siguiente sintaxis:
function`your template ${foo}`;Se denomina literal de plantilla etiquetada.
La función que se llama como literal de plantilla etiquetada recibe sus argumentos de la siguiente manera:
function taggedTemplate(strings, arg1, arg2, arg3, arg4) { console.log(strings); console.log(arg1, arg2, arg3, arg4); } taggedTemplate`a${1}b${2}c${3}`;arg4 (porque solo hay 3 veces la interpolación de cadenas) y, por lo tanto, se registra undefined cuando intentamos registrar arg4Si no sabemos de antemano cuántas veces tendrá lugar la interpolación de cadenas en la cadena de la plantilla, suele ser útil utilizar la sintaxis del parámetro rest. Esta sintaxis almacena los argumentos restantes que recibe la función en una matriz. Por ejemplo:
function taggedTemplate(strings, ...rest) { console.log(rest); } taggedTemplate `a${1}b${2}c${3}`; taggedTemplate `a${1}b${2}c${3}d${4}`;Llegó tarde a la fiesta pero, TBH, ninguna de las respuestas da una explicación al 50% de la pregunta original ("por qué el raw: Array[1] ")
console.log`1`Como otros han señalado, esto se llama Plantilla etiquetada (más detalles también aquí ).
Usando esta sintaxis, la función recibirá los siguientes argumentos:
Básicamente, los siguientes son 'casi' equivalentes :
// Tagged Template fn`My uncle ${uncleName} is ${uncleAge} years old!` // function call fn(["My uncle ", " is ", " years old!"], uncleName, uncleAge);(ver punto 2. para entender por qué no son exactamente iguales)
["1", raw: Array[1]] ??? La matriz que se pasa como primer argumento contiene una propiedad raw , que permite acceder a las cadenas sin procesar tal como se ingresaron (sin procesar secuencias de escape).
Ejemplo de caso de uso:
let fileName = "asdf"; fn`In the folder C:\Documents\Foo, create a new file ${fileName}` function fn(a, ...rest) { console.log(a); //In the folder C:DocumentsFoo, create a new file console.log(a.raw); //In the folder C:\Documents\Foo, create a new file }¿Qué, una matriz con una propiedad? ???
Sí, dado que las matrices de JavaScript son en realidad objetos, pueden almacenar propiedades .
Ejemplo:
const arr = [1, 2, 3]; arr.property = "value"; console.log(arr); //[1, 2, 3, property: "value"]