Каково фактическое использование ES6 Raw String Access?
Каковы фактическое использование String.raw
Raw String Access, введенного в 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
Единственное, что я понимаю, это то, что он используется для получения исходной строковой формы строк шаблона и используется для отладки строки шаблона.
Когда это можно использовать в режиме реального времени? Они называли эту функцию тегом. Что это значит?
Какие конкретные варианты использования мне не хватает?
Ответы
Ответ 1
Самый лучший и почти единственный вариант использования для String.raw
, о котором я могу думать, это если вы пытаетесь использовать что-то вроде Стивена Левитана XRegExp
library, который принимает текст со значительными обратными косыми чертами. Использование String.raw
позволяет вам писать что-то семантически чистое, а не думать о удвоении ваших обратных косых черт, точно так же, как вы можете в литерале регулярных выражений в самом JavaScript.
Например, предположим, что я выполняю обслуживание на сайте, и я нахожу это:
var isSingleUnicodeWord = /^\w+$/;
..., который предназначен для проверки, содержит ли строка только буквы. Две проблемы: A) Есть тысячи "словесных" символов в области человеческого языка, которые \w
не признает, потому что его определение ориентировано на английский язык; и B) Он включает в себя _
, который многие (включая консорциум Unicode) будут утверждать не как "письмо".
Итак, если мы используем XRegExp
на сайте, так как я знаю, что он поддерживает \pL
(\p
для категорий Unicode и L
для "буквы" ), я мог бы быстро поменять это на:
var isSingleUnicodeWord = XRegExp("^\pL+$"); // WRONG
Тогда мне интересно, почему это не сработало, facepalm, и вернитесь назад и избегайте этой обратной косой черты, поскольку она потребляется строковым литералом.
Достаточно легко в этом простом регулярном выражении, но в чем-то сложном, помня, что удваивать все эти обратные косые черты - это боль в обслуживании. (Просто спросите Java-программистов, пытающихся использовать Pattern
.)
Введите String.raw
:
let isSingleUnicodeWord = XRegExp(String.raw`^\pL+$`);
Пример:
let isSingleUnicodeWord = XRegExp(String.raw`^\pL+$`); // L: Letter
console.log(isSingleUnicodeWord.test("Русский")); // true
console.log(isSingleUnicodeWord.test("日本語")); // true
console.log(isSingleUnicodeWord.test("العربية")); // true
console.log(isSingleUnicodeWord.test("foo bar")); // false
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.min.js"></script>
Ответ 2
Строки шаблонов могут быть полезны во многих ситуациях, которые я объясню ниже. Учитывая это, String.raw предотвращает интерпретацию экранов. Это может быть полезно в любой строке шаблона, в которой вы хотите содержать escape-символ, но не хотите его избегать. Простым примером может быть следующее:
var templateWithBackslash = String.raw `someRegExp displayed in template /^\//`
Внутри есть несколько вещей, которые приятно отметить с помощью строк шаблонов.
- Они могут содержать неограниченные разрывы строк без проблем.
- Они могут содержать "$ {}". Внутри этих фигурных скобок javascript интерпретируется вместо этого.
(Примечание: при запуске они выведут результат на консоль [в средствах браузера dev])
Пример использования разрывов строк:
var myTemplate = `
<div class="myClass">
<pre>
My formatted text
with multiple lines
{
asdf: "and some pretty printed json"
}
</pre>
</div>
`
console.log(myTemplate)
Ответ 3
Во-первых, несколько вещей:
- Шаблонные строки - это старое имя для шаблонных литералов.
- Тег - это функция.
- String.raw - это метод.
- String.raw
foo\n${ 42 }bar
- это тег с шаблоном тегов.
- Литералы шаблонов - это в основном причудливые строки.
- Литералы шаблонов могут интерполировать.
- Литералы шаблонов могут быть многострочными, не используя
\
.
- String.raw требуется для выхода из escape-символа
\
.
Попробуйте помещать строку, содержащую символ новой строки \n
через функцию, которая потребляет символ новой строки.
console.log("This\nis\nawesome"); // "This\nis\nawesome"
console.log(String.raw`This\nis\nawesome`); // "This\\nis\\nawesome"
Если вам интересно, console.log не является одним из них. Но alert
есть. Попробуйте запустить их через http://learnharmony.org/.
alert("This\nis\nawesome");
alert(String.raw`This\nis\nawesome`);
Но подождите, что не использование String.raw
.
Возможное использование метода String.raw
:
- Показать строку без интерпретации символов с обратной стороны (\n,\t) и т.д.
- Показать код для вывода. (Как в примере ниже)
- Для использования в регулярном выражении без экранирования
\
.
- Чтобы распечатать расположение директорий/подкаталогов Windows, не используя
\\
, чтобы многое. (Они используют \
, помните. Кроме того, lol)
Здесь мы можем показать вывод и код для него в окне одиночного предупреждения:
alert("I printed This\nis\nawesome with " + Sring.raw`This\nis\nawesome`);
Хотя, было бы здорово, если бы основное использование могло состоять в том, чтобы вернуть исходную строку. Как:
var original = String.raw`This is awesome.`;
где original
стал бы: This\tis \tawesome.
. Это не так печально.
Литература:
Ответ 4
В NodeJS это очень удобно, когда дело касается обработки файлов:
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))
})
Это улучшает читаемость файловых путей в Windows. \
также является довольно распространенным разделителем, поэтому я могу определенно понять, почему это было бы полезно в целом. Однако довольно глупо, как \
все еще избегает `... Итак, в конечном счете:
String.raw`C:\Users\` //#==> C:\Users\`
console.log(String.raw`C:\Users\`) //#==> SyntaxError: Unexpected end of input.
Ответ 5
Использование
(Необходимое знание: tstring & sect;.)
Вместо:
console.log(`\\a\\b\\c\\n\\z\\x12\\xa9\\u1234\\u00A9\\u{1234}\\u{00A9}`);
.you можете:
console.log(String.raw`\a\b\c\n\z\x12\xa9\u1234\u00A9\u{1234}\u{00A9}`);
"Высвобождение"
< \\u
> отлично, но < \u
> требуется "экранирование", например:
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
> (до < \\7
> ), < \1
> , < console.log(String.raw`abc${`\\1`}abc`)
> ;
. < \\
> , endunit < \
> , < console.log(String.raw`abc${`\\`}`)
> .
Nb
Также есть новая строка "латекс". Cf & sect;.