2016-02-10 2 views
1

Я пишу JavaScript для переводчика Python и «\ 8» и «\ 9» вызывает у меня проблемы с множеством проблем. Согласно документации, что-то вроде «\ 8» или «\ 9» является незаконным, так как они не являются действительными восьмеричными экранами. Esprima parser исключает исключение из такого литерала. Однако двигатели JS, по-видимому, позволяют им, и они оценивают «8» и «9» соответственно.JavaScript « 8» буквально

Поэтому:

/\8/.exec("\8") 
RegExp('\\8').exec('\8') 
/\8/.exec("8") 
RegExp('\\8').exec('8') 

Если все вернуть спичкой, так как/\ 8/должна быть такой же, как/8 /. Однако результаты несовместимы с JS-двигателями, а некоторые возвращают совпадение, а другие - нет (например, Safari).

В чем причина всех этих различий? И каков правильный путь - как справляться с другими делами, связанными с этими литералами?

+3

Двигатели JS в браузерах очень снисходительны (иногда слишком снисходительны для их же пользы), потому что продолжать работать - это функция. Транспилеры гораздо менее снисходительны, потому что ошибки лова - это особенность. – kay

+2

Ваш вопрос немного неясен. Что именно вы ожидаете от матча, и что вы ожидали от него не совпадать? –

+0

Проблема в том, что я понятия не имею, должны ли они совпадать или нет, потому что согласно спецификации эти утверждения являются незаконными, но они разрешены в Js Engines, и поэтому некоторые из моих модульных тестов терпят неудачу. Поэтому я ищу дополнительную информацию о том, как обращаться с этими случаями. –

ответ

3

You're right that the spec does not allow for it, но никто никогда не говорил, что двигатели JS идеальны.

«Правильный» способ обработки этих случаев - сообщить о них как синтаксическую ошибку, учитывая, что это недействительно в JS или Python *.

* Насколько я знаю. Я не пишу много Python, но быстрый Googling, кажется, указывает, что это не так.

+0

@ capsillers Правда, но [как вы видите здесь] (http://www.ecma-international.org/ecma-262/6.0/#table-34) одиночные восьмеричные экранизации не входят в «современную» спецификацию , поддерживается только как устаревшие последовательности. –

+1

Да, сразу после публикации я осознал особую значимость приложения к этому вопросу (т. Е. Приложение * делает * разрешает экранированные цифры, но * только *, если они строго меньше 8). – apsillers