W języku C# można użyć dosłownie sznurki tak:Czy obsługa JavaScript obsługuje łańcuchy znaków?
@"\\server\share\file.txt"
Czy jest coś podobnego w JavaScript?
W języku C# można użyć dosłownie sznurki tak:Czy obsługa JavaScript obsługuje łańcuchy znaków?
@"\\server\share\file.txt"
Czy jest coś podobnego w JavaScript?
Nie, obsługa JavaScript nie jest obsługiwana. A to obejście wydaje się bardzo problematyczne, ponieważ utracisz możliwość posiadania ukośników.
Sam wpadłem na ten problem, gdy potrzebowałem zbudować komunikat ostrzegawczy lub coś z zaplecza ASP.NET i wstawić go do alertu JavaScript z przodu. Problem polegał na tym, że programiści mogli wprowadzić cokolwiek w metodzie Page.Alert().
Co zrobiłem, aby rozwiązać ten problem był następujący:
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.
}
będę ponownie iteracji, co zostało powiedziane wcześniej - verbatim struny nie są możliwe w javascript. Łatwo jest uniknąć ważnych znaków ewakuacyjnych, takich jak \n \\ \t
itd., Ale problem pochodzi z nieumiejętnych znaków z powodu sposobu, w jaki są one obsługiwane w różnych funkcjach, które stają się niekompatybilne. Na przykład
"\a".replace("\a","\\a") // WORKS \a
"aa\a".replace("\a", "\\a") // FAILS \aaa
Także, jeśli spojrzeć na tablicę niedozwolonych znaków specjalnych np ["\a"]
postać będzie po prostu wyglądać a
. To sprawia, że robienie tego, co chcesz, jest zasadniczo niemożliwe.
Mam nadzieję, że przynajmniej to wyczyści.
Big kludge stanowi obejście ...
<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>
Ma to wiele efektów ubocznych, lepiej mieć nadzieję, że nie ma ich w łańcuchu. –
@Juan Mendes: Nie rozumiesz, jaka część "Big kludge"? –
Z Wikipedii: "Kludge (lub kluge) to obejście, szybkie i brudne rozwiązanie, niezdarne lub nieeleganckie, ** a jednak skuteczne ** ..." Twoje rozwiązanie powoduje błędne wyniki dzięki prostemu wprowadzeniu, nie nawet kwalifikuje się jako kludge. –
Szablon ciągi robić przerwy linię wsparcia.
`so you can
do this if you want`
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals
Nie ma oczywiście zapobiec występowaniu ekspansji in tekstu, a co za tym idzie, wykonanie kodu, ale może to dobrze?
Uwaga: Nie sądzę, istnieje sposób, aby podjąć istniejący ciąg i uruchomić go poprzez interpolację ekspresji. To uniemożliwia wstrzyknięcie kodu w ten sposób, ponieważ kod musi pochodzić ze źródła. Nie znam interfejsu API, który może wykonywać interpolację wyrazów na żądanie.
Uwaga 2: Ciągi szablonów to funkcja ES2015/ES6. Wsparcie w każdej przeglądarce oprócz (czekaj na to ...) IE! Jednak Edge obsługuje ciągi szablonów.
Uwaga 3: Ciągi szablonów rozwijają sekwencje ucieczki, jeśli w ciągu znaków ciąg znaków zawiera ciąg znaków, który rozszerza sekwencje specjalne.
`"A\nB"`
... spowoduje:
"A B"
...który nie zadziała z
JSON.parse
, ponieważ istnieje teraz nowa linia w literale łańcuchowym. Może być dobrze wiedzieć.
Dzięki, to zadziałało dla mnie. Potrzebowałem szybkiej metody zdobywania kodów postaci do testowania i działało to dobrze. – Teorist
Jest to bardzo stary wątek, ale wciąż tu jest obejście:
function verbatim(fn){return fn.toString().match(/[^]*\/\*\s*([^]*)\s*\*\/\}$/)[1]}
Który będzie używany jako to:
var myText = verbatim(function(){/*This
is a multiline \a\n\0 verbatim line*/})
zasadzie to, co się dzieje, jest to, że js traktuje komentarze rzeczywiście jako ciągi znaków. Ponadto są one przechowywane wraz z funkcją. Tak więc, dzieje się tak, że tworzymy funkcję z kilkoma dosłownymi komentarzami, które wypakowujemy w funkcji dosłowności.
Nie wiem, dlaczego wszyscy mówią o ucieczce postaci i zastępowaniu napisów, ponieważ wydaje się to być przeciwieństwem dosłownego - chociaż PO porównuje programowanie z JS, nie stwierdził, że potrzebuje interoperacyjności między nimi. Ta odpowiedź działa w elegancki i zaskakujący sposób - to rozjaśniło mój dzień! Ale tylko skopiowanie JS dało mi błąd "Nie można uzyskać właściwości" 1 "niezdefiniowanej lub zerowej referencji". Zmiana instrukcji return na 'return fn.toString(). Split ("/* ") [1] .split (" */") [0]' aby uzyskać tylko wszystko pomiędzy komentarzami zrobiłem to, czego potrzebuję. z podziękowaniami. – wunth
Wystarczy użyć String.raw()
String.raw`\n`
wyjście wola
\\n
Ale nie wiem jak rozwiązać sprawę:
String.raw`hello`hello` // It will throw an TypeError
String.raw`hello\`hello` // Output is 'hello\\`hello'
nie wiem jak radzić sobie z `
:(
Był to tylko przykład dobrze pasujący do danego pytania (ścieżka Windows). Możesz zastąpić/przez dowolny znak. – PhiLho