Поддерживает ли JavaScript дословные строки? - PullRequest
17 голосов
/ 12 ноября 2008

В C # вы можете использовать дословные строки, например:

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

Есть ли что-то похожее в JavaScript?

Ответы [ 6 ]

13 голосов
/ 23 февраля 2016

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

`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, потому что теперь в строковом литерале есть новая строка. Может быть, стоит знать.

8 голосов
/ 12 ноября 2008

Нет, это не поддерживается в 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.
}
5 голосов
/ 28 февраля 2016

Это очень старая тема, но все же есть обходной путь:

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

Который вы будете использовать как:

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

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

4 голосов
/ 12 ноября 2008

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

<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>
2 голосов
/ 27 мая 2017

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

String.raw`\n`

выдаст

\\n

Но я не знаю, как решить дело:

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

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

2 голосов
/ 12 ноября 2008

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

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

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

Надеюсь, это хотя бы прояснит для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...