Utilizzo del carattere backtick (`) in JavaScript


277

In JavaScript, un backtick sembra funzionare come una singola citazione. Ad esempio, posso usare un backtick per definire una stringa come questa:

var s = `abc`;

Esiste un modo in cui il comportamento del backtick differisce effettivamente da quello di una singola citazione?


† Notare che tra i programmatori, "backtick" è un nome per quello che viene generalmente chiamato accento grave . I programmatori a volte usano anche i nomi alternativi "backquote" e "backgrave". Inoltre, su Stack Overflow e altrove, altre ortografie comuni per "backtick" sono "back-tick" e "back tick".


Si prega di leggere di seguito anche per l'utilizzo dei modelli con tag. Questo è un uso diverso rispetto alla domanda che viene posta. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… E questo è spiegato in una delle risposte più lunghe di seguito. stackoverflow.com/a/40062505/3281336
Pats

1
Il "backgrave" è ridicolo, perché non esiste un accento grave in avanti - si chiama accento acuto
Walter Tross,

Risposte:


298

Questa è una funzione chiamata letterale template .

Erano chiamati "stringhe di modelli" nelle precedenti edizioni della specifica ECMAScript 2015.

I letterali dei modelli sono supportati da Firefox 34, Chrome 41 e Edge 12 e versioni successive, ma non da Internet Explorer.

I letterali template possono essere usati per rappresentare stringhe su più righe e possono usare "interpolazione" per inserire variabili:

var a = 123, str = `---
   a is: ${a}
---`;
console.log(str);

Produzione:

---
   a is: 123
---

Ciò che è più importante, possono contenere non solo un nome di variabile, ma qualsiasi espressione JavaScript:

var a = 3, b = 3.1415;

console.log(`PI is nearly ${Math.max(a, b)}`);

2
Ci sono dei polifili vitali per questo dato la mancanza di supporto per questo?
Alexander Dixon,

3
@AlexanderDixon, no non si può Polyfill questa caratteristica del linguaggio in senso classico, anche se si potrebbe utilizzare i modelli di sottolineatura o lodash per le variabili nelle stringhe in combinazione con multilining stringhe utilizzando gli array: ["a", "b"].join(""); // both string elements written in new lines. Ma a parte questo si potrebbe usare un "transpiler" come Babel per convertire ES6 + in ES5
try-catch-finally

2
Letterali template con tag usando backtick! Questo è valido e funziona bene:alert`1`.
Константин Ван

@UnionP Supportato da tutti i principali browser incluso MS Edge: kangax.github.io/compat-table/es6/#test-template_literals
Jonathan Cross

2
@kiki sembra che il linguaggio di script sia una variante di ECMAScript. Gli script di Google App non supportano ovviamente le funzionalità di ECMAScript 2015. Non sono riuscito a trovare una specifica ufficiale sulla lingua che stanno usando.
Try-catch-finalmente

162

ECMAScript 6 propone un nuovo tipo di stringa letterale, usando il backtick come delimitatore. Questi valori letterali consentono di incorporare espressioni di interpolazione di stringhe di base, che vengono quindi analizzate e valutate automaticamente.

let person = {name: 'RajiniKanth', age: 68, greeting: 'Thalaivaaaa!' };

let usualHtmlStr = "<p>My name is " + person.name + ",</p>\n" +
  "<p>I am " + person.age + " old</p>\n" +
  "<strong>\"" + person.greeting + "\" is what I usually say</strong>";

let newHtmlStr =
 `<p>My name is ${person.name},</p>
  <p>I am ${person.age} old</p>
  <p>"${person.greeting}" is what I usually say</strong>`;

console.log(usualHtmlStr);
console.log(newHtmlStr);

Come puoi vedere, abbiamo usato il `around una serie di caratteri, che sono interpretati come una stringa letterale, ma qualsiasi espressione del modulo ${..}viene analizzata e valutata immediatamente in linea.

Un vantaggio davvero interessante dei letterali interpolati di stringhe è che possono dividersi su più righe:

var Actor = {"name": "RajiniKanth"};

var text =
`Now is the time for all good men like ${Actor.name}
to come to the aid of their
country!`;
console.log(text);
// Now is the time for all good men
// to come to the aid of their
// country!

Espressioni interpolate

Ogni espressione valida può apparire all'interno ${..}di una stringa interpolata letterale, comprese le chiamate di funzione, le chiamate di espressione di funzione in linea e persino altri letterali di stringa interpolati!

function upper(s) {
  return s.toUpperCase();
}
var who = "reader"
var text =
`A very ${upper("warm")} welcome
to all of you ${upper(`${who}s`)}!`;
console.log(text);
// A very WARM welcome
// to all of you READERS!

Qui, la `${who}s`stringa interpolata interna letterale è stata per noi un po 'più comoda quando si combina la whovariabile con la "s"stringa, al contrario who + "s". Inoltre, per mantenere una nota è una stringa interpolata letterale con ambito lessicale solo dove appare, non con ambito dinamico in alcun modo:

function foo(str) {
  var name = "foo";
  console.log(str);
}
function bar() {
  var name = "bar";
  foo(`Hello from ${name}!`);
}
var name = "global";
bar(); // "Hello from bar!"

L'uso del modello letterale per l'HTML è decisamente più leggibile riducendo il fastidio.

Il vecchio modo semplice:

'<div class="' + className + '">' +
  '<p>' + content + '</p>' +
  '<a href="' + link + '">Let\'s go</a>'
'</div>';

Con ECMAScript 6:

`<div class="${className}">
  <p>${content}</p>
  <a href="${link}">Let's go</a>
</div>`
  • La stringa può estendersi su più righe.
  • Non è necessario sfuggire ai caratteri di citazione.
  • Puoi evitare raggruppamenti come: ""> "
  • Non è necessario utilizzare l'operatore plus.

Letterali modello con tag

Possiamo anche taggare una stringa di modello, quando viene taggata una stringa di modello, i valori letterali e le sostituzioni vengono passati alla funzione che restituisce il valore risultante.

function myTaggedLiteral(strings) {
  console.log(strings);
}

myTaggedLiteral`test`; //["test"]

function myTaggedLiteral(strings, value, value2) {
  console.log(strings, value, value2);
}
let someText = 'Neat';
myTaggedLiteral`test ${someText} ${2 + 3}`;
//["test", ""]
// "Neat"
// 5

Qui possiamo usare l'operatore spread per passare più valori. Il primo argomento - l'abbiamo chiamato stringhe - è un array di tutte le stringhe semplici (il materiale tra le espressioni interpolate).

Abbiamo poi raccogliamo tutti gli argomenti successivi in un array chiamato valori utilizzando la ... gather/rest operator, anche se si potrebbe, naturalmente, li hanno lasciato come singoli parametri denominati seguenti stringhe di parametri come abbiamo fatto in precedenza ( value1, value2, ecc).

function myTaggedLiteral(strings, ...values) {
  console.log(strings);
  console.log(values);
}

let someText = 'Neat';
myTaggedLiteral`test ${someText} ${2 + 3}`;
//["test", ""]
// "Neat"
// 5

Gli argomenti raccolti nella nostra matrice di valori sono i risultati delle espressioni di interpolazione già valutate trovate nella stringa letterale. Una stringa con tag letterale è come una fase di elaborazione dopo la valutazione delle interpolazioni, ma prima che venga compilato il valore della stringa finale, consentendo un maggiore controllo sulla generazione della stringa dal valore letterale. Diamo un'occhiata a un esempio di creazione di modelli riutilizzabili.

const Actor = {
  name: "RajiniKanth",
  store: "Landmark"
}

const ActorTemplate = templater`<article>
  <h3>${'name'} is a Actor</h3>
  <p>You can find his movies at ${'store'}.</p>

</article>`;

function templater(strings, ...keys) {
  return function(data) {
    let temp = strings.slice();
    keys.forEach((key, i) => {
      temp[i] = temp[i] + data[key];
    });
    return temp.join('');
  }
};

const myTemplate = ActorTemplate(Actor);
console.log(myTemplate);

Stringhe grezze

Le nostre funzioni tag ricevono un primo argomento che abbiamo chiamato stringhe, che è un array. Ma c'è un ulteriore bit di dati incluso: le versioni non elaborate non elaborate di tutte le stringhe. Puoi accedere a quei valori di stringa non elaborati utilizzando la .rawproprietà, in questo modo:

function showraw(strings, ...values) {
  console.log(strings);
  console.log(strings.raw);
}
showraw`Hello\nWorld`;

Come puoi vedere, la versione grezza della stringa preserva la \nsequenza di escape , mentre la versione elaborata della stringa la tratta come una vera nuova riga senza escape . ECMAScript 6 è dotato di una funzione built-in che può essere utilizzato come un tag letterali stringa: String.raw(..). Passa semplicemente attraverso le versioni non elaborate delle stringhe:

console.log(`Hello\nWorld`);
/* "Hello
World" */

console.log(String.raw`Hello\nWorld`);
// "Hello\nWorld"

1
Bella risposta! Piccolo commento, nella sezione Letterature dei template con tag, credo che i due output di array di esempio per myTaggedLiteral`test ${someText} ${2 + 3}`;dovrebbero essere //["test ", " "](cioè non stringhe tagliate).
Michael Krebs,

3
Scorri verso il basso per vedere l'account dell'autore, non è stato deluso! Buona spiegazione xD
varun,

Buona spiegazione e ampia copertura, grazie. Volevo solo aggiungere che c'è anche una buona panoramica sul sito degli sviluppatori di Mozilla: letterali di template (stringhe di template) che trattano alcuni aspetti extra.
Dev Ops

1
Nit: "ECMAScript 6 propone un nuovo tipo di stringa letterale" Non è una stringa letterale, è un modello letterale. Risulta in una stringa se valutato se non è etichettato. Questo non è solo dogmatico, ci sono posti in cui è possibile utilizzare valori letterali stringa in cui i valori letterali modello non sono consentiti (come nomi di parametri non calcolati, identificatori di moduli ...).
TJ Crowder,

La frase che include "è una stringa interpolata letterale è solo a scopo lessicale" è incomprensibile. Puoi aggiustarlo?
Peter Mortensen,

21

I backtick ( `) sono usati per definire i letterali dei template. I letterali dei modelli sono una nuova funzionalità di ECMAScript 6 per semplificare il lavoro con le stringhe.

Caratteristiche:

  • possiamo interpolare qualsiasi tipo di espressione nei letterali dei template.
  • Possono essere multilinea.

Nota: possiamo facilmente usare virgolette singole ( ') e virgolette doppie ( ") all'interno dei backtick ( `).

Esempio:

var nameStr = `I'm "Rohit" Jindal`;

Per interpolare le variabili o l'espressione possiamo usare la ${expression}notazione per quello.

var name = 'Rohit Jindal';
var text = `My name is ${name}`;
console.log(text); // My name is Rohit Jindal

Le stringhe su più righe indicano che non è più necessario utilizzare \nper nuove righe.

Esempio:

const name = 'Rohit';
console.log(`Hello ${name}!
How are you?`);

Produzione:

Hello Rohit!
How are you?

15

I backtick racchiudono letterali di template, precedentemente noti come stringhe di template. I letterali modello sono letterali stringa che consentono espressioni incorporate e funzionalità di interpolazione di stringhe.

I letterali modello hanno espressioni incorporate nei segnaposto, indicati dal simbolo del dollaro e dalle parentesi graffe attorno a un'espressione, vale a dire ${expression}. Il segnaposto / espressioni vengono passati a una funzione. La funzione predefinita concatena la stringa.

Per sfuggire a una barra retroversa, inserire una barra rovesciata prima di essa:

`\`` === '`'; => true

Usa i backtick per scrivere più facilmente una stringa multilinea:

console.log(`string text line 1
string text line 2`);

o

console.log(`Fifteen is ${a + b} and
not ${2 * a + b}.`);

vs. vanilla JavaScript:

console.log('string text line 1\n' +
'string text line 2');

o

console.log('Fifteen is ' + (a + b) + ' and\nnot ' + (2 * a + b) + '.');

Sequenze di escape:

  • Fughe Unicode avviate da \u, ad esempio\u00A9
  • Fughe di punti di codice Unicode indicati \u{}, ad esempio\u{2F804}
  • Fughe esadecimali avviate \x, ad esempio\xA9
  • Fughe letterali ottali iniziate da \e (a) cifre, ad esempio\251

10

Sommario:

I backtick in JavaScript sono una funzionalità introdotta in ECMAScript 6 // ECMAScript 2015 per rendere semplici stringhe dinamiche. Questa funzione ECMAScript 6 è anche denominata stringa di modello letterale . Offre i seguenti vantaggi rispetto alle stringhe normali:

  • Nelle stringhe modello le interruzioni di riga sono consentite e pertanto possono essere multilinea. I letterali di stringa normale (dichiarati con ''o "") non possono avere interruzioni di riga.
  • Possiamo facilmente interpolare i valori delle variabili nella stringa con la ${myVariable}sintassi.

Esempio:

const name = 'Willem';
const age = 26;

const story = `
  My name is: ${name}
  And I'm: ${age} years old
`;

console.log(story);

Compatibilità del browser:

La stringa di modelli letterali è supportata in modo nativo da tutti i principali fornitori di browser (tranne Internet Explorer). Quindi è piuttosto salva da usare nel tuo codice di produzione. Un elenco più dettagliato delle compatibilità del browser è disponibile qui .


10

Oltre all'interpolazione di stringhe, puoi anche chiamare una funzione usando il back-tick.


var sayHello = function () {
    console.log('Hello', arguments);
}

// To call this function using ``

sayHello`some args`; // Check console for the output

// Or
sayHello`
    some args
`;

Controlla il componente in stile . Lo usano pesantemente.


7

La parte buona è che possiamo fare direttamente la matematica di base:

let nuts = 7

more.innerHTML = `

<h2>You collected ${nuts} nuts so far!

<hr>

Double it, get ${nuts + nuts} nuts!!

`
<div id="more"></div>

È diventato davvero utile in una funzione di fabbrica:

function nuts(it){
  return `
    You have ${it} nuts! <br>
    Cosinus of your nuts: ${Math.cos(it)} <br>
    Triple nuts: ${3 * it} <br>
    Your nuts encoded in BASE64:<br> ${btoa(it)}
  `
}

nut.oninput = (function(){
  out.innerHTML = nuts(nut.value)
})
<h3>NUTS CALCULATOR
<input type="number" id="nut">

<div id="out"></div>


3
nessun altro ridacchiò cmon ora
StayCool
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.