2016-12-05 22 views
7

ES6 wprowadziła template strings ograniczoną przez backticks `.zmiana ograniczników ciągu na backticks: możliwy wpływ?

W jakich przypadkach byłoby zastąpienie pojedynczych lub podwójnych "' cudzysłowie sznurku przez backticks uzyskując inny wynik, lub w inny sposób być niebezpieczne?

Ucieczka z istniejących zwrotników wewnątrz kodu jest wykonywana w ramach operacji.

// before 
var message = "Display backtick ` on screen"; 

// after 
var message = `Display backtick \` on screen`; 

Rozumiem, że każdy łańcuch zawierający ${...} zawiedzie, ponieważ byłoby to (mis) interpretowane jako zastępczy. Czy są jakieś inne istotne wzorce?


Kontekst: jest to dla development of a JS compression tool, który automatycznie przetwarza kod wejściowy. Ten ostatni i zawarte w nim ciągi są dostarczane przez użytkownika, dlatego nie mam kontroli nad jego zawartością. Jedynym założeniem, które można zrobić, jest to, że jest to poprawny skrypt JavaScript.

Środowisko wykonawcze może być wykonane przez dowolną nową przeglądarkę lub węzeł Node.js.

+0

Co powiesz na coś takiego: var message = "Cześć, jestem Mike, miło cię poznać". Czy to wyjdzie jako \ "Hello, I \\ m Mike, to miło cię poznać \? –

+0

@SariRahal OP poprosił o zamianę cytatów * wokół * ciągu znaków. –

+3

Czy mogę zaproponować użycie parsera do przetwarzania kodu, zamiast myśleć o tym, używając go do wyszukiwania i zamiany? http://esprima.org/ powinien mieć wszystkie potrzebne funkcje. – Tomalak

Odpowiedz

2

Możesz sprawdzić gramatykę string literals i no-substitution-templates.
Oprócz ` w porównaniu do ' w porównaniu do " i specjalnego znaczenia ${, które już wspomniano, tylko podział linii różni się między tymi dwoma formularzami. Możemy zignorować kontynuacje linii ("escaped linebreaks"), ponieważ twój minifier usunie je tak czy inaczej, ale zwykłe łamania linii są poprawne w szablonach, a nie w literałach ciągów, więc jeśli konwertujesz w tę iz powrotem, będziesz musiał się tym zająć jako dobrze. Możesz nawet użyć ich do zapisania kolejnego bajtu, jeśli twój ciąg literowy zawiera \n.

Powiązane problemy