В js-файлах русские символы, да и любые другие символы с кодом больше 127, внутри строк нужно обязательно экранировать, если кодировка файла не совпадает с кодировкой страницы. Конечно, в таких случаях можно явно указывать требуемую кодировку
<script src="my-cool-app.js" charset="windows-1251">
Если заранее экранировать такие символы, то в дальнейшем уже будет неважно в какой кодировке «сервируется» ваш файл.
Mathias Bynens описал различные варианты экранирования и даже сделал утилиту, которая может экранировать так, чтобы результирующая строка была наименьшей длинны.
Я расскажу очень быстрый способ получить экранированную строку прямо в консоли браузера.
escape("Привет").replace(/%(u[0-9a-f]{4})/ig, "\\$1")
В результате получим экранированную строку:
"\u041F\u0440\u0438\u0432\u0435\u0442"
У этого метода есть один недостаток: символы с кодом меньше 128 нужно обрабатывать отдельным регэкспом.
escape("Hello!").replace(/%([0-9a-f]{2})/ig, "\\x$1")
Коментарии к заметке
Зачем это все, когда есть юникод?
Хороший вопрос. В идеальном мире, где все пользуются только Юникодом, об это можно не думать вообще.
Я работаю над проектом, который по историческим причинам клиенту отдается в Windows-1251. Разумеется, вся разработка ведётся в UTF-8 и кодировка статических файлов (js, css и т.п.) в дальнейшем не меняется. Бывают случаи, когда проще захардкодить строку прям в js-коде, а не пользоваться специальными средствами локализации. А зачастую, это может быть единственным разумным вариантом.