Подтвердить что ты не робот

Каково фактическое использование 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

Единственное, что я понимаю, это то, что он используется для получения исходной строковой формы строк шаблона и используется для отладки строки шаблона.

Когда это можно использовать в режиме реального времени? Они называли эту функцию тегом. Что это значит?

Какие конкретные варианты использования мне не хватает?

4b9b3361

Ответ 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;.