Валидность кода и философия JavaScript
Объясните, пожалуйста, разные случаи валидности/не валидности кода:
Не валиден <script type="text/javascript"> {"p1": "test"} </script> Валиден <script type="text/javascript"> ({"p1": "test"}) </script> Не валиден <script type="text/javascript"> alert(()); </script> Валиден <script type="text/javascript"> alert({}); </script> Валиден <script type="text/javascript"> alert({"p1": "test"}); </script> Валиден <script type="text/javascript"> alert(({"p1": "test"})); </script> Особо интересуют первые два случая |
Встречный вопрос: те случаи, которые у вас невалидны. А почему они должны быть валидны? Что должен делать первый невалидный код? А второй?
|
Цитата:
<script type="text/javascript"> var p = eval('{"p1": "test"}'); </script> Валиден <script type="text/javascript"> var p = eval('({"p1": "test"})'); </script> Такой ответ устроит? |
Вам сюда.
|
Цитата:
Я вот с логической точки зрения не вижу разницы между Валиден <script type="text/javascript"> "test" </script> и Не валиден <script type="text/javascript"> {"p1": "test"} </script> Что мешает парсеру(интерпретатору) понять, что у меня объект и почему круглые скобки помогают ему это сделать? |
Потому что фигурные скобки это не только объект, а ещё блок.
if (condition) { } {} воспринимаются как литерал объекта только внутри выражения, иначе они будут блоком. А в скобках это уже выражение. |
Далее. Вот такое выражение уже будет валидным
{p1: "test"}На подумать :) |
Цитата:
|
И я уже чувствую, как мозг отдаляется от черепа. Товарищи гуру, будет просто здорово, если вы кратко поясните приведенные моменты, в том числе вариант на "подумать" от Kolaj. Из ссылки на приложение А не удалось вычленить причины такого поведения js, похоже подобного уровня понимания языка я не достиг.
Или будет также отлично, если приведёте ссылку на тот раздел спецификации, где чётко поясняется механика разбора подобных вещей интерпретатором. Если он есть и он отличается от приложения А. Спасибо. |
Цитата:
Объяснять пока не буду, надо же подумать-то хоть немного. |
Kolyaj, ok, важны все разделы одинаково, или следует обратить внимание на какие-то из них особенно?
|
Там грамматика языка. Обращать внимание даже не знаю на что.
|
А ларчик просто открывался. В js есть метки. Ими я не пользовался, потому, раз прочитав, забыл о них.
Далее, если {} не участвует в выражении, значит это не литерал объекта, а блок. Т.е. в примере Kolyaj фигурные скобки отбрасываем без потери смысла. Меткой может быть любой набор разрешенных символов, кроме зарезервированных слов, после метки идёт двоеточие и инструкция. Меткой не может быть строка, например, потому вариант с заключением метки в кавычки не валиден. Что касается двух первых примеров, то фигурные скобки в обычных скобках, это уже литерал объекта (все что в скобках вычисляется). Без скобок это просто блок, т.е., можно их просто отбросить в нашем случае. Все логично и понятно. Мозг вернулся обратно. Дзен начинает познаваться. Но, кстати, помогло не приложение А (дзен не познан до конца), а Флэнаган. |
Часовой пояс GMT +3, время: 11:08. |