Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Валидность кода и философия JavaScript (https://javascript.ru/forum/misc/23490-validnost-koda-i-filosofiya-javascript.html)

peterpan7700 25.11.2011 14:03

Валидность кода и философия 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>


Особо интересуют первые два случая

Kolyaj 25.11.2011 14:11

Встречный вопрос: те случаи, которые у вас невалидны. А почему они должны быть валидны? Что должен делать первый невалидный код? А второй?

peterpan7700 25.11.2011 15:33

Цитата:

Сообщение от Kolyaj (Сообщение 138956)
Встречный вопрос: те случаи, которые у вас невалидны. А почему они должны быть валидны? Что должен делать первый невалидный код? А второй?

Не валиден
<script type="text/javascript">
	var p = eval('{"p1": "test"}');
</script>


Валиден
<script type="text/javascript">
	var p = eval('({"p1": "test"})');
</script>


Такой ответ устроит?

Kolyaj 25.11.2011 15:44

Вам сюда.

peterpan7700 25.11.2011 16:07

Цитата:

Сообщение от Kolyaj (Сообщение 138967)
Вам сюда.

Спасибо, что не гуглить послали. Значит у меня есть надежда, что Вы удовлетворите мою просьбу разжевать свой ответ?

Я вот с логической точки зрения не вижу разницы между

Валиден
<script type="text/javascript">
	"test"
</script>

и
Не валиден
<script type="text/javascript">
	{"p1": "test"}
</script>


Что мешает парсеру(интерпретатору) понять, что у меня объект и почему круглые скобки помогают ему это сделать?

Kolyaj 25.11.2011 16:20

Потому что фигурные скобки это не только объект, а ещё блок.
if (condition) {

}

{} воспринимаются как литерал объекта только внутри выражения, иначе они будут блоком. А в скобках это уже выражение.

Kolyaj 25.11.2011 16:22

Далее. Вот такое выражение уже будет валидным
{p1: "test"}
На подумать :)

Aetae 25.11.2011 16:34

Цитата:

Сообщение от Kolyaj (Сообщение 138972)
Далее. Вот такое выражение уже будет валидным
{p1: "test"}
На подумать :)

Это только вынесет мозг тому, кто не сечёт фишку.))

GuardCat 25.11.2011 17:58

И я уже чувствую, как мозг отдаляется от черепа. Товарищи гуру, будет просто здорово, если вы кратко поясните приведенные моменты, в том числе вариант на "подумать" от Kolaj. Из ссылки на приложение А не удалось вычленить причины такого поведения js, похоже подобного уровня понимания языка я не достиг.

Или будет также отлично, если приведёте ссылку на тот раздел спецификации, где чётко поясняется механика разбора подобных вещей интерпретатором. Если он есть и он отличается от приложения А.

Спасибо.

Kolyaj 25.11.2011 18:02

Цитата:

Сообщение от GuardCat
Если он есть и он отличается от приложения А.

Он есть, он ничем не отличается от приложения А, он и есть приложение А.

Объяснять пока не буду, надо же подумать-то хоть немного.

GuardCat 25.11.2011 18:07

Kolyaj, ok, важны все разделы одинаково, или следует обратить внимание на какие-то из них особенно?

Kolyaj 25.11.2011 18:13

Там грамматика языка. Обращать внимание даже не знаю на что.

GuardCat 25.11.2011 21:50

А ларчик просто открывался. В js есть метки. Ими я не пользовался, потому, раз прочитав, забыл о них.
Далее, если {} не участвует в выражении, значит это не литерал объекта, а блок. Т.е. в примере Kolyaj фигурные скобки отбрасываем без потери смысла. Меткой может быть любой набор разрешенных символов, кроме зарезервированных слов, после метки идёт двоеточие и инструкция. Меткой не может быть строка, например, потому вариант с заключением метки в кавычки не валиден.

Что касается двух первых примеров, то фигурные скобки в обычных скобках, это уже литерал объекта (все что в скобках вычисляется). Без скобок это просто блок, т.е., можно их просто отбросить в нашем случае.

Все логично и понятно. Мозг вернулся обратно. Дзен начинает познаваться.

Но, кстати, помогло не приложение А (дзен не познан до конца), а Флэнаган.


Часовой пояс GMT +3, время: 11:08.