Quelles sont les utilisations réelles de String.raw
Raw String Access introduit dans ECMAScript 6?
// String.raw(callSite, ...substitutions)
function quux (strings, ...values) {
strings[0] === "foo\n"
strings[1] === "bar"
strings.raw[0] === "foo\\n"
strings.raw[1] === "bar"
values[0] === 42
}
quux `foo\n${ 42 }bar`
String.raw `foo\n${ 42 }bar` === "foo\\n42bar"
http://es6-features.org/#RawStringAccess
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw
http://www.2ality.com/2015/01/es6-strings.html
https://msdn.Microsoft.com/en-us/library/dn889830(v=vs.94).aspx
La seule chose que je comprends, c’est qu’il est utilisé pour obtenir la forme de chaîne brute de chaînes de modèle et est utilisé pour déboguer la chaîne de modèle.
Quand cela peut-il être utilisé dans le développement en temps réel? Ils appelaient cela une fonction de tag. Qu'est-ce que ça veut dire?
Quels cas d'utilisation concrets me manque?
Les chaînes de modèles peuvent être utiles dans de nombreuses situations que je vais expliquer ci-dessous. Considérant cela, le fichier String.raw empêche l’interprétation des échappements. Cela peut être utile dans n'importe quelle chaîne de modèle dans laquelle vous voulez contenir le caractère d'échappement mais ne voulez pas l'échapper. Un exemple simple pourrait être le suivant:
var templateWithBackslash = String.raw `someRegExp displayed in template /^\//`
Il y a quelques éléments à l'intérieur qui sont agréables à noter avec des chaînes de modèle.
(Remarque: leur exécution générera le résultat sur votre console [dans les outils de développement du navigateur])
Exemple utilisant des sauts de ligne:
var myTemplate = `
<div class="myClass">
<pre>
My formatted text
with multiple lines
{
asdf: "and some pretty printed json"
}
</pre>
</div>
`
console.log(myTemplate)
Si vous vouliez faire ce qui précède avec une chaîne de caractères normale en Javascript, cela ressemblerait à ceci:
var myTemplate = "\
<div class="myClass">\
<pre>\
My formatted text\
with multiple lines\
{\
asdf: "and some pretty printed json"\
}\
</pre>\
</div>"
console.log(myTemplate)
Vous remarquerez que le premier est probablement beaucoup plus joli (pas besoin d'échapper aux sauts de ligne).
Pour la seconde, je vais utiliser le même modèle de chaîne, mais aussi insérer le JSON imprimé.
var jsonObj = {asdf: "and some pretty printed json", deeper: {someDeep: "Some Deep Var"}}
var myTemplate = `
<div class="myClass">
<pre>
My formatted text
with multiple lines
${JSON.stringify(jsonObj, null, 2)}
</pre>
</div>
`
console.log(myTemplate)
Tout d'abord, quelques choses:
foo\n${ 42 }bar
est un littéral de modèle balisé.\
.\
.Essayez de placer une chaîne contenant un caractère de nouvelle ligne \n
via une fonction qui utilise un caractère de nouvelle ligne.
console.log("This\nis\nawesome"); // "This\nis\nawesome"
console.log(String.raw`This\nis\nawesome`); // "This\\nis\\nawesome"
Si vous vous le demandez, console.log n'en fait pas partie. Mais alert
est. Essayez de les exécuter via http://learnharmony.org/ .
alert("This\nis\nawesome");
alert(String.raw`This\nis\nawesome`);
Mais attendez, ce n'est pas l'utilisation de String.raw
.
Utilisations possibles de la méthode String.raw
:
\
.\\
trop. (Ils utilisent \
Remember. Aussi, lol)Ici, nous pouvons afficher la sortie et le code correspondant dans une seule fenêtre d’alerte:
alert("I printed This\nis\nawesome with " + Sring.raw`This\nis\nawesome`);
Cependant, cela aurait été bien si Son utilisation principale aurait pu être de récupérer la chaîne d'origine. Comme:
var original = String.raw`This is awesome.`;
où original
serait devenu: This\tis \tawesome.
. Ce n'est malheureusement pas le cas.
Références:
(Connaissances requises: tstring § .)
Au lieu de:
console.log(`\\a\\b\\c\\n\\z\\x12\\xa9\\u1234\\u00A9\\u{1234}\\u{00A9}`);
.vous pouvez:
console.log(String.raw`\a\b\c\n\z\x12\xa9\u1234\u00A9\u{1234}\u{00A9}`);
<\\u
> est correct, mais <\u
> doit "s'échapper", par exemple:
console.log(String.raw`abc${'\\u'}abc`);
.Dit <\\x
>, <\x
>, <console.log(String.raw`abc${`\\x`}abc`)
>;
. <\`
>, <`
>, <console.log(String.raw`abc${`\``}abc`)
>;
. <\${
>, <${&
>, <console.log(String.raw`abc${`$\{`}abc`)
>;
. <\\1
> (jusqu'au <\\7
>), <\1
>, <console.log(String.raw`abc${`\\1`}abc`)
>;
. <\\
>, unité <\
>, <console.log(String.raw`abc${`\\`}`)
>.
Il y a aussi une nouvelle corde "latex". Cf § .
Dans NodeJS, il est extrêmement pratique pour gérer les chemins de fichiers:
var fs=require('fs');
var s = String.raw`C:\Users\<username>\AppData\Roaming\SomeApp\someObject.json`;
var username = "bob"
s=s.replace("<username>",username)
fs.readFile(s,function(err,result){
if (err) throw error;
console.log(JSON.parse(result))
})
Cela améliore la lisibilité des chemins de fichiers sous Windows. \
est aussi un séparateur assez commun, donc je peux vraiment voir pourquoi il serait utile en général. Cependant, il est assez stupide de voir comment \
échappe encore `... Donc, finalement:
String.raw`C:\Users\` //#==> C:\Users\`
console.log(String.raw`C:\Users\`) //#==> SyntaxError: Unexpected end of input.
Je l’ai trouvé utile pour les testsmy RegExps. Dites que j'ai un RegExp qui Devrait correspondre aux commentaires de fin de ligne parce que Je veux les supprimer. MAIS, il ne doit pas faire correspondre le code source pour une expression rationnelle telle que /// . Si votre code contient ///, ce n'est pas le début D'un commentaire EOL, mais une RegExp, comme selon les règles de la syntaxe JavaScript.
Je peux tester si mon RegExp dans la variable patEOLC Correspond ou non /// avec:
String.raw`/\//` .match (patEOLC)
En d’autres termes, c’est une façon de laisser mon code "Voir" le code tel qu’il existe dans le code source .__, pas comme il existe dans la mémoire après sa lecture Dans la mémoire depuis le code source, avec toutes les barres obliques inverses supprimées.
C'est un moyen "d'échapper à la fuite" mais Sans devoir le faire séparément Pour chaque barre oblique inversée d'une chaîne, mais Pour tous en même temps.
C'est une façon de dire que, dans une barre oblique inversée chaîne Donnée., Elle doit se comporter comme tout autre caractère Elle n'a pas de signification ou d'interprétation particulière