Поддерживает ли 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'
Я не знаю, как иметь дело с `
: (