Non javascript sono le stringhe letterali?

In c# e rubino e molte altre lingue è possibile indicare una stringa che non ha bisogno di fuggire.
in c# come questo

string s = @"\whatever\this\is";

i risultati sono stampato

\whatever\this\is

la mia domanda è, questo è supportato in qualsiasi forma in javascript?

 

6 Replies
  1. 137

    Risposta breve: No

    Risposta lunga: Noooooooooooooooooooooooooo

    • La risposta lunga è in realtà “Noooooooooooooooooooooooooo’.
    • infatti lo è 😀
    • no è la risposta più lunga!
    • Ho ripristinato la recente modifica che ha cambiato completamente questa risposta, pretendere che modello di valori letterali possono essere utilizzati come stringhe letterali. Per una serie di ragioni: (1) Per cambiare radicalmente una risposta in questo modo è fuorviante, (2) c’è già un’altra risposta (da Iain Reid sotto) proponendo modello di valori letterali (3), come ha commentato l’altra risposta, modello di valori letterali non le stringhe letterali; per esempio non si può mettere una stringa contenente \useless o ${what is this} all’interno di uno di essi.
    • Non c’è assolutamente alcun motivo per modificare questa risposta – “non compare nei motori di ricerca” non è una giustificazione.
  2. 21

    Non so cosa stai facendo, ma un modo per aggirare il problema della fuga (ecc) è utilizzare un trucco che John Resig sembra come un sacco. Si includono <script> blocchi in una pagina, ma di dare loro un “tipo” come “text/plain” per assicurarsi che il browser non consegnarli a Javascript. Quindi utilizzare il testo del blocco di script per ciò che si desidera.

    <script id='a_string' type='text/plain'>
      Here is some stuff.
      There might be some \escape sequences in it.
    </script>

    Quindi puoi prendere con $('#a_string').text() (o con getElementById se non si utilizza jQuery o qualcosa di simile).

    edit: Ecco John Resig la spiegazione sul perché buttare roba in blocchi di script del genere è una buona idea:

    Suggerimento rapido: l’Incorporamento di script nella pagina che dispone di una unknown tipo di contenuto (è il caso qui – il browser non sa come eseguire un text/html script) sono semplicemente ignorato dai browser e dai motori di ricerca e screenreader. Si tratta di un perfetto dispositivo di occultamento per infiltrare i modelli nella vostra pagina. Mi piace usare questa tecnica per quick-and-dirty casi in cui ho solo bisogno di un po ‘ di template o due sulla pagina e volete qualcosa di leggero e veloce.

    Tratte da questa pagina: http://ejohn.org/blog/javascript-micro-templating/

    • Qual è il vantaggio rispetto all’uso di alcuni altri casuale elemento DOM nascosta alla vista, con i CSS? Sembra che si rompe la semantica dell’elemento script.
    • Non so, francamente, ho cercato di capire che fuori. Ho incontrato in esempi per il nuovo jQuery “modello” di roba. Sono d’accordo che sembra squirrely, e specialmente se si considera che jQuery con blocchi di script quando si inserire in modo dinamico i contenuti tramite “html()”. Ancora, è una cosa che le persone fanno, io non sono sicuro di quello che l’OP sta cercando di scoprire o raggiungere.
    • Ho aggiornato la risposta con un frammento di Resig blog
    • Non avevo pensato al motore di ricerca di angolo. Interessante.
    • Penso che questo è di meglio, per dire, hidden <div> per realizzare il compito, che si è permesso di usare “<” e “>” più leggera. Se il modello è solo un codice HTML valido, poi certo si può usare <div> per la racchiudono. Se, tuttavia, il modello è scritto in qualche linguaggio di template (manubri, un carattere di sottolineatura, ecc) che supporta le espressioni condizionali (if, try, catch) e loop (per, in, foreach, mappa, …) si può rapidamente finire con una stringa blob che non hanno pareggiato i tag di apertura e chiusura, viola le regole di nidificazione, ha incompiuto attributi etc.
    • concordato. Quando ho scritto quel commento su la mia risposta, non sapevo di quanto faccio ora 🙂 Inoltre, jQuery non si striscia blocchi di script che hanno un esplicito il tipo di attributo non-JavaScript (come “text/html”).

  3. 3

    Le stringhe letterali sono disponibili attraverso l’uso di ES6 caratteristiche del linguaggio. Nodo v4.x ora supporta questi circa il 90% degli altri ES6 aggiunte anche.

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings

    In JS valori letterali stringa noto come Modello di Stringhe. E la sintassi è abbastanza dritto in avanti.

    • Le stringhe letterali e modello di stringhe non sono in realtà la stessa cosa. Una stringa letterale non ha i caratteri di un significato speciale a tutti. Modello stringhe trattare ${ come una particolare sequenza.
    • Penso che in realtà String.raw() metodo (che è parte del Modello di valori letterali) è il più vicino si potrebbe arrivare a un modello di stringhe.
    • Prova questo: String.raw`this is a \useless feature`: essa si traduce in “Uncaught SyntaxError: Invalid Unicode sequenza di escape”. Confrontare con il dire r'this is a \useless feature' in Python. Così modello di stringhe (anche con String.raw) interpretare non solo ${ ma anche \u (e altre) le sequenze di escape. La domanda \whatever\this\is capita di lavorare con String.raw, ma è solo perché nessuno dei tre parole è capitato di iniziare con u o x per esempio. 🙂
    • Che cosa sono stati chiamati “le stringhe letterali” sono ora chiamati “modello di valori letterali”, e non soddisfano l’esempio per la domanda originale, perché quando ho tipo `\whatever\this\is` il risultato è “qualsiasi cosa hisis” (tutte le barre rovesciate sono andati e la t è stato trasformato in una scheda). Un altro nit: JavaScript ha sempre avuto il concetto di “valori letterali stringa” (nel senso di stringhe racchiuse tra virgolette nel codice), ma non sono verbatim valori letterali stringa (o “stringhe letterali”, come il titolo dice).
    • BTW in circa un anno e mezzo dopo ho lasciato un precedente commento nel luglio del 2017, sembra che qualcosa di simile console.log(String.raw`\whatever\this\is\a\useless\xylophone`) adesso (che inizia dopo questa proposta), così ora l’unica cosa che un String.raw letterale non può contenere (se non si desidera essere trattati come speciale) è ${
  4. 2

    Semplicemente la fuga sfugge

    var myCrazyString = "\\yes\\we\\have\\no\\bananas"
    • La domanda espressamente richiesto che: “questo è supportato in ogni forma, javascript” e si riferiva a “denot[ing] di una stringa, non hanno bisogno di fuggire”. L’aggiunta di più sfugge è il tipo di l’opposto di quanto non necessitano di fughe…
  5. 1

    So che è di sei anni, a tarda ora, ma ho una soluzione a questo 😉

    JS:

    function literalString(regex) {
        return ('' + regex).slice(1, -1);
    };
    
    O.innerHTML = literalString(/\whatever\this\is/);

    HTML:

    <pre id=O>

    È fondamentalmente convertire una regex per stringa e rimuove il primo e l’ultimo caratteri.

    • Un idea carina, ma purtroppo richiede la vostra stringa letterale di essere un valido regex. (Per esempio, prova a formare il valore letterale di stringa [a- o *{2,3} o ** circostante con / su entrambi i lati.) Questo è ancora più onerose che semplicemente bisogno di due barre rovesciate.
  6. 1

    Questo funzionerà finché non passi un \x nella stringa!

    JS:

    var str = String.raw`\whatever\this\is`;
    
    console.log(str);

    • Il \x non è l’unica cosa: non si può avere un \u nella stringa, per esempio.

Lascia un commento