Letterlijke sjablonen met geneste backticks(`) in ES6

Hoe kan ik een letterlijke sjabloon in ECMAScript 6 schrijven die op zichzelf backticks(`) bevat (d.w.z. geneste backticks)?

Bijvoorbeeld:

var query = `
  UPDATE packet
  SET
  `association` = "3485435",
  `tagname` = "associated"
 `

De reden waarom ik het nodig heb:

Het is vrij duidelijk in mijn codevoorbeeld hierboven.

Ik probeer node-mysql-query’s te bouwen als Stringsen sla ze op in een variabele om ze door te geven aan MySQL. De syntaxis van de MySQL-query vereist back-ticks voor zoekopdrachten in UPDATE-stijl.

  • De enige manier waarop ik ze er netjes uit kan laten zien & netjes is door sjabloonletterwoorden te gebruiken, anders zien de zoekopdrachten met gewone strings met één regel er vreselijk uit omdat ze in sommige gevallen erg lang worden.

  • Ik wil ook voorkomen dat ik regels afsluit met \nomdat dit omslachtig is.


Antwoord 1, autoriteit 100%

Van ES6 In Depth: Template strings door Jason Orendorff:

Als u een backtick in een sjabloontekenreeks moet schrijven, moet u deze escapen met een backslash: `\``is hetzelfde als "`".

Uw vraag zou moeten zijn:

var query = `UPDATE packet
  SET
  \`association\` = "3485435",
  \`tagname\` = "Simos"`

Antwoord 2, autoriteit 13%

Zie 11.8.6 Sjabloon Letterlijk Lexical Componenten

Een sjabloon zonder vervangingen wordt gedefinieerd als

NoSubstitutionTemplate ::
    ` TemplateCharactersopt `

waar een sjabloonteken staat

TemplateCharacter ::
    $ [lookahead ≠ { ]
    \ EscapeSequence
    LineContinuation
    LineTerminatorSequence
    SourceCharacter but not one of ` or \ or $ or LineTerminator

Daarom kan `geen sjabloonteken zijn, tenzij je het ontsnapt door er \voor te zetten.


Antwoord 3, autoriteit 7%

Zoals vermeld in andere antwoorden, kunt u de backtick `ontwijken met een backslash, zoals \`.

var tripleBacktickExample = `
\`\`\`python
# This JavaScript string contains some example Markdown that
# uses triple-backticks to delimit a Python code block.
\`\`\`
`

Als je echter heel veel backticks op een rij `````in de letterlijke sjabloon nodig hebt, kan het leesbaarder zijn om ze in een normale tekenreeks te plaatsen die zich in een tijdelijke aanduiding bevindt, zoals ${'`````'}of ${"`````"}.

var tripleBacktickExample = `
${'```'}python
# This JavaScript string contains some example Markdown that
# uses triple-backticks to delimit a Python code block.
${'```'}
`

Antwoord 4, autoriteit 7%

Als je een apostrof wilt gebruiken in een string gemaakt met apostrofs, ontsnap je eraan met een backslash, zoals deze:

'\''

Als je een backtick in een letterlijke sjabloon wilt gebruiken, moet je deze ontsnappen met een backslash:

`\``

Antwoord 5, autoriteit 3%

Gebruik \`, het lijkt voor mij te werken in de nieuwste Chrome.


Antwoord 6, autoriteit 3%

Persoonlijk beschouw ik de letterlijke ES6-templates als ontoereikend voor SQL (en Markdown), voornamelijk omdat je kunt geen backtick-tekens gebruiken. Ik zou willen dat ze strings met drie aanhalingstekens zouden toevoegen om dit goed op te lossen.

In de tussentijd, aangezien je waarschijnlijk toch een transpiler voor ES6 gebruikt, zou je kunnen overwegen om triplet te gebruiken (disclaimer: ik ben de auteur).


Antwoord 7

Om te ontsnappen aan alle speciale tekens, niet alleen de backticks:

let str = '`Hello`\\n${world}';
let escacped = str.replace(/\\|`|\$/g, '\\$&');
console.log(eval('`' + escaped + '`') === str); // test

Ik had dit nodig voor wat codegeneratie-dingen. De strwas de inhoud van een JavaScript-bestand en het doel was om deze inhoud in een letterlijke tekenreeksvariabele in een ander gegenereerd JavaScript-bestand te plaatsen.

Helaas lijkt het erop dat er (2019) geen native JavaScript-functie is voor deze escape. De tekens die moeten worden vervangen zijn: `, \, $en \.


Antwoord 8

ES6 heeft nieuwe functies:

  • Letterlijke sjablonen
  • Tagged template letterlijke (getagde templates)

Wat het werken met strings makkelijker maakt. Je plaatst je tekst in `backticks`.

Hiermee kunnen we:

  1. Interpoleervariabelen

    let foo = "abc";
    console.log(`Welcome ${foo}`); // Welcome abc
    
  2. Interpoleer elke vorm van uitdrukking

    console.log(`2+3 = ${2+3}`) // 2+3 = 5
    
  3. Declareer strings met zowel ‘ als ” aanhalingstekens zonder te hoeven
    aan alles ontsnappen.

    let foo = `foo is 'bar', "bar" is foo`
    console.log(foo); // "foo is 'bar', "bar" is foo"
    
  4. Schonere syntaxis voor tekenreeks met meerdere regels

    let text = `foo is bar
    bar is foo`
    console.log(text);
    //"foo is bar
    //bar is foo"
    
  5. Tagged templates, we kunnen template literals doorgeven aan een functie, hier is hoe:

    let person = 'Mike';
    let age = 28;
    let output = myTag `that ${ person } is ${ age }`;
    function myTag(strings, personExp, ageExp) {
        // strings[0] gets value "that "
        // strings[1] gets value " is "
        // personExp  gets value " Mike "
        // ageStr     gets value "28"
        return strings[0] + personExp + strings[1] + ageExp;
    }
    console.log(output);
    // that Mike is 28
    
  6. String.raw, we kunnen de onbewerkte vorm krijgen, hier is het voorbeeld:

    let text = String.raw `The "\n" newline won't result in a new line.'
    console.log(text);
    // The "\n" newline won't result in a new line.
    

Other episodes