Learn JavaScript

String.raw() - статический метод для raw-строк в JavaScript

String.raw() возвращает raw-версию шаблонной строки.

Это значит, что escape-последовательности вроде \n, \t или \uXXXX не преобразуются, а остаются в строке как обычные символы \ и буквы после него.

Синтаксис

Чаще всего String.raw() используют как тег шаблонной строки:

String.raw`text`
String.raw`Hello\nworld`
String.raw`Value: ${value}`

Есть и более низкоуровневый вариант вызова:

String.raw({ raw: ["A", "B", "C"] }, 1, 2)

Но на практике обычно используют именно тег шаблонной строки.

Как работает String.raw()

console.log(String.raw`line1\nline2`);
// "line1\nline2"

Для сравнения обычная шаблонная строка обработает \n как перевод строки:

console.log(`line1\nline2`);

Здесь в результате будет уже настоящая новая строка.

Что возвращает метод

String.raw() возвращает обычную строку типа string.

const text = String.raw`hello\nworld`;

console.log(typeof text); // "string"

Когда это полезно

String.raw() удобно использовать, когда:

  • нужно показать escape-последовательности как текст
  • нужно удобно записать путь или шаблон
  • важно сохранить raw-вид шаблонной строки

Пример с путём:

console.log(String.raw`C:\temp\file.txt`);
// "C:\temp\file.txt"

Если записать такую же строку как обычный template literal, часть последовательностей будет интерпретирована:

console.log(`C:\temp\file.txt`);

Это может дать неожиданный результат из-за \t и \f.

String.raw() и подстановки

String.raw() сохраняет raw-вид только у текстовых частей шаблона.

Подставляемые значения ${...} вставляются как обычно.

console.log(String.raw`Hi\n${123}`); // "Hi\n123"

Но если само подставляемое значение уже содержит перевод строки, он останется настоящим переводом строки:

const value = "\n";

console.log(String.raw`A${value}B`);

То есть raw-режим не “замораживает” значения внутри ${...}. Он работает именно с частями шаблона.

String.raw() и обычная строка

String.raw() - это не метод экземпляра строки, а статический метод объекта String.

Правильно:

String.raw`hello\nworld`

Неправильно:

// "hello".raw(); // Ошибка

String.raw() и регулярные выражения

Этот метод бывает удобен, когда нужно записать шаблон как строку и не хочется удваивать обратные слэши.

const pattern = String.raw`\d+\s\w+`;

console.log(pattern); // "\\d+\\s\\w+" как текст шаблона

Это может быть полезно, когда regex-шаблон формируется в виде строки.

Низкоуровневый вызов

String.raw() можно вызвать и без template literal, если вручную передать объект с raw.

console.log(String.raw({ raw: ["A", "B", "C"] }, 1, 2)); // "A1B2C"

Но в обычном коде такой способ используется редко.

Частые ошибки

Думать, что String.raw() делает “сырой” весь результат целиком

const value = "\n";

console.log(String.raw`A${value}B`);

Подставленные значения вставляются как есть. Raw-режим относится только к тексту шаблона.

Пытаться вызвать String.raw() у строки

// "text".raw(); // Ошибка

String.raw() - это статический метод String, а не метод строкового значения.

Путать String.raw() с обычной экранированной строкой

console.log(String.raw`line1\nline2`); // "line1\nline2"

Здесь \n не превращается в перенос строки.

Быстрая памятка

  • String.raw() чаще всего используют как тег шаблонной строки
  • метод возвращает обычную строку
  • escape-последовательности в шаблоне не обрабатываются
  • ${...} подставляется как обычно
  • String.raw() - статический метод, а не метод строки

Коротко

String.raw() - это статический метод JavaScript, который возвращает raw-версию шаблонной строки. Он полезен, когда нужно сохранить escape-последовательности как текст, например для путей, шаблонов и отладочных строк.