2015-08-28 11 views
7

Durante il test delle nuove stringhe di modelli di JavaScript ES6 (in Firefox, se è importante), ho notato alcune incongruenze nei loro tipi.Tipo incoerente per stringhe di modelli ES6 JavaScript

ho definito una funzione personalizzata, in questo modo:

function f(a) { 
    console.log(typeof(a)); 
    console.log(a); 
} 

In primo luogo, ho provato la funzione "normalmente", usando le parentesi intorno alla stringa di modello.

f(`Hello, World!`) 

Come previsto, questo ha prodotto un tipo di string e Hello, World! è stato emesso alla console.

Quindi ho chiamato la funzione stenografia, senza le parentesi e si sono verificate incoerenze.

f`Hello, World!` 

Il tipo è diventato object, e Array [ "Hello, World!" ] è stato emesso alla console.

Perché la stringa modello è stata avvolta in un array quando si utilizza il secondo metodo? Questo è solo un bug in Firefox (ES6 è un nuovo standard, dopotutto) o è previsto questo comportamento per qualche motivo?

+1

Provate 'console.log \' a $ {1} b $ {2} c \ ';' per capire meglio cosa sta succedendo. Omettendo la parentesi, hai completamente cambiato il significato della tua affermazione: non stai semplicemente chiamando la funzione più, ma stai usando un * modello con tag *. Sì, questa sintassi fa schifo. – Blackhole

risposta

2
// A function call, passed the result of a template literal. 
f(`str`) 

e

// A tagged template call, passed metadata about a template. 
f`str` 

non sono gli stessi. Il primo chiama f con una stringa singola come argomento. Il secondo chiama f con diversi parametri, a seconda del modello. per esempio.

f`one${2}three${4}five` 

passerebbe f

f(strings, ...values) 

con

strings 
// ['one', 'three', 'five'] 

che è un elenco di tutte le sezioni di archi del modello, e

values 
// [2, 4] 

che sono tutti dei valori che in forma tra le corde. Ciò consente ai tag di preelaborare la stringa ed elaborarla.

documentation on MDN can help more.

+0

Da un utente di 36k rep, mi aspettavo di elencare un collegamento alle specifiche. Un po 'deluso. – Blackhole

+0

Grazie per l'aiuto! Ho suggerito una modifica per aggiungere che questa sintassi è chiamata stringhe di modelli con tag, come ho appreso dal commento di @ Blackhole, per aiutare i futuri utenti. Questa risposta è stata utile e informativa. – jrich

+0

@ Funzione indefinita: si chiama "modello con tag" (nessuna "stringa"). Penso che sia un po 'fuorviante chiamare le "stringhe" (quelle ufficiali sono chiamate "template tagged" e "template letteral"), soprattutto perché i template taggati non necessariamente risultano in stringhe. –