Поддерживает ли JavaScript стенографические строки?

В С# вы можете использовать дословные строки следующим образом:

@"\\server\share\file.txt"

Есть ли что-то подобное в JavaScript?

Ответы

Ответ 1

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

Я сам столкнулся с этой проблемой, когда мне нужно было создать предупреждающее сообщение или что-то из задней части ASP.NET и вставить его в оповещение JavaScript на передней панели. Проблема заключалась в том, что разработчики могли вводить что-либо в метод Page.Alert().

Что я сделал для решения этой проблемы, было следующее:

public void Alert(string message)
{
    message = message.Replace("\\", "\\\\")
        .Replace("\r\n", "\n")
        .Replace("\n", "\\n")
        .Replace("\t", "\\t")
        .Replace("\"", "\\\"");

    // and now register my JavaScript with this safe string.
}

Ответ 2

Строки шаблонов поддерживают разрывы строк.

`so you can
do this if you want`

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals

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

Примечание. Я не думаю, что есть способ взять существующую строку и запустить ее через интерполяцию выражения. Это делает невозможным инъекцию кода таким образом, поскольку код должен исходить из источника. Я не знаю API, который может выполнять интерполяцию по запросу по запросу.

Примечание 2: Шаблонные строки - это функция ES2015/ES6. Поддержка в каждом браузере, кроме (дождаться его...) IE! Тем не менее, Edge поддерживает строки шаблонов.

Примечание 3: Строки шаблонов расширяют escape-последовательности, если у вас есть строка внутри строки, которая будет расширять свои escape-последовательности.

`"A\nB"`

... приведет к:

"A
B"

..., который не будет работать с JSON.parse, потому что теперь есть строка в строковом литерале. Может быть хорошо знать.

Ответ 3

Это очень старый поток, но все же здесь обход:

function verbatim(fn){return fn.toString().match(/[^]*\/\*\s*([^]*)\s*\*\/\}$/)[1]}

Что вы будете использовать как это:

var myText = verbatim(function(){/*This
 is a multiline \a\n\0 verbatim line*/})

В основном, что происходит здесь, так это то, что js рассматривает комментарии действительно как стенографические строки. Кроме того, они хранятся вместе с функцией. Итак, что здесь происходит, так это то, что мы создаем функцию с некоторыми дословными комментариями, которые мы извлекаем в функции verbatim.

Ответ 4

Большой kludge обходного пути...

<html>
<head>
<script>
function foo() {
    var string = document.getElementById('foo').innerHTML;
    alert(string);
}
window.onload=foo;
</script>
<style>
#foo{
  display: none;
}
</style>
</head>
<body>
Calling foo on page load.
<div id="foo">\\server\path\to\file.txt</div>
</body>
</html>

Ответ 5

Я буду повторять то, что было сказано ранее - стенографические строки невозможно в javascript. На самом деле легко избежать правильных escape-символов, таких как \n \\ \t и т.д., Но проблема возникает из-за экранирования недействительных символов из-за того, как они обрабатываются в разных функциях, которые они становятся несовместимыми. Например

"\a".replace("\a","\\a")     // WORKS \a
"aa\a".replace("\a", "\\a")  // FAILS \aaa

Также, если вы посмотрите на массив незаконных специальных символов, например ["\a"], символ будет выглядеть как a. Это делает невозможным делать то, что вы хотите.

Надеюсь, что это по крайней мере очистит вас.

Ответ 6

Просто используйте String.raw()

String.raw`\n`

выводит

\\n

Но я не знаю, как решить случай:

String.raw`hello`hello`  // It will throw an TypeError
String.raw`hello\`hello` // Output is 'hello\\`hello'

Я не знаю, как иметь дело с `: (