Выражения и операторы в JavaScript

Я только начал изучать JavaScript с книги "Eloquent JavaScript", которая доступна бесплатно на eloquentjavascript.net. Пока мне книга очень нравится, только один раздел я не понимаю. Это о выражениях и утверждениях:

http://eloquentjavascript.net/chapter2.html#p65af5913

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

В начале абзаца автор объясняет, что такое выражения: Если я правильно понимаю, атомарные значения, такие как 42 или «23», считаются выражениями. Если применить эти значения к оператору (как в 42 - 19), это тоже будет считаться выражением. (Наверное, потому что оно, очевидно, равно 23, что опять-таки является атомарным значением.) Я интерпретирую это следующим образом: Каждое значение — независимо от того, введено оно напрямую или еще не вычислено — называется выражением. Это правильно?

Then the author says the following: "There exists a unit that is bigger than an expression. It is called a statement. [...] Most statements end with a semicolon (;). The simplest kind of statement is an expression with a semicolon after it." As an example he mentions

!false;
as an example statement. My questions is "What makes this a statement? Just the semicolon at the end?" When I use the JavaScript console, it makes absolutely no difference whether I type that in with or without the semicolon. It always returns true. However, the author says that "[A] statement only amounts to something if it somehow changes the world." So the given example is not even a statement since it "just produce[s] the value [...] true, and then immediately throw[s it] into the bit bucket"? I am really confused now... If I did not entirely mess it up in my head, a statement has to have some "side-effect" (like a declaration of a variable), right?

Однако я был бы очень рад, если бы кто-нибудь объяснил, что такое оператор. Также было бы очень полезно, если бы кто-нибудь мог привести пример, в котором различие этих терминов действительно полезно, потому что прямо сейчас я даже не могу себе представить, почему автор вообще утруждает себя введением этих словарей. Заранее большое спасибо!


person lkbaerenfaenger    schedule 15.01.2013    source источник
comment
Да, каждое значение любого типа само по себе является выражением. Один тип оператора также является выражением, и точка с запятой не делает его оператором; это выражение и утверждение одновременно. (Однако точка с запятой не является частью выражения.)   -  person Pointy    schedule 16.01.2013
comment
Оператор в любом случае является просто синтаксической конструкцией. Когда автор говорит об утверждении, равнозначном чему-то, это неформальная шутка. Оператор, который ничего не делает (например, false;), остается оператором.   -  person Pointy    schedule 16.01.2013
comment
Вы можете просто увидеть, что выражения являются подмножеством операторов, потому что каждое выражение также является оператором-выражением. Или это вас еще больше смущает? ;)   -  person Felix Kling    schedule 16.01.2013
comment
О, и, наконец, полезно знать, что означают эти термины, потому что они появляются при описании других синтаксических конструкций. То есть бывают случаи, когда что-то описывается, и знание того, что вы можете вставить любое выражение или любое утверждение, имеет большое значение.   -  person Pointy    schedule 16.01.2013
comment
@FelixKling Итак, каждое выражение также является утверждением. Так что должно быть утверждение, которое в то же время не является выражением, я думаю. Как бы это выглядело?   -  person lkbaerenfaenger    schedule 16.01.2013
comment
@Pointy Не могли бы вы объяснить мне эту неформальную шутку? Если утверждение не обязательно меняет мир, как и выражение, почему вы считаете его чем-то отличным от утверждения?   -  person lkbaerenfaenger    schedule 16.01.2013
comment
Спасибо, ребята, за ваши быстрые ответы: D   -  person lkbaerenfaenger    schedule 16.01.2013
comment
Любые управляющие структуры, такие как if операторы, циклы for, foreach, while, являются операторами. Функция declaration также является оператором. Объявление переменной с var является оператором.   -  person Felix Kling    schedule 16.01.2013


Ответы (1)


Простая, хотя и неопределенная аналогия — это текст на естественном языке, состоящий из фраз, сгруппированных в предложения. Фраза, например, «идет дождь», может сама по себе образовывать предложение, например, «я не выйду на улицу. идет дождь». или быть частью более крупного предложения, например, «Ужасная погода, все время идет дождь».

Тем не менее, различие между выражениями и утверждениями в javascript очень размыто. В отличие от других C-подобных языков, вы можете иметь не только выражения в операторах, но и операторы внутри выражений:

a = 1 + function(x) { if(x > 1) return 10 } (20) 

Некоторые современные программы javascript, такие как Jquery, используют методы объявления, которые в основном делают их одним единственным выражением.

Это размытое различие (не говоря уже о путанице) происходит из-за того, что Javascript, будучи императивным языком, подобным C/pascal/algol, в то же время находился под сильным влиянием функциональных языков, таких как Lisp, которые не имеют понятия " заявления". В функциональном языке все является выражением.

Чтобы сделать вещи более интересными, точка с запятой между операторами (иногда) необязательна, так что нет простого способа определить, принадлежат ли два выражения одному оператору или образуют два разных. Рассмотреть возможность:

 a = 1  // two
 !2     // statements

 a = 1  // one
 +2     // statement
person georg    schedule 15.01.2013
comment
Я бы не согласился с утверждениями, возможными внутри выражений. Просто просмотрите список выражений (es5.github.com/#x11-toc) и посмотрите, разрешает ли какое-либо из этих утверждений. Есть конструкции, которые можно интерпретировать либо как выражение, либо как утверждение, но в остальном различие совершенно ясно. - person Felix Kling; 16.01.2013
comment
@FelixKling: добавил пример. - person georg; 16.01.2013
comment
А... ммх ладно. Я предполагаю, что функциональные выражения какие-то особенные ;) (что как-то подтверждается тем фактом, что они имеют свой собственный раздел в спецификации). - person Felix Kling; 16.01.2013
comment
@ thg435 Спасибо за пример на естественном языке. Если я не выйду. Идет дождь. представляет собой утверждение, однако я не думаю, что это может быть частью еще большей группы фраз или предложения. Таким образом, этот пример не совсем соответствует идее о том, что операторы также могут быть частью выражений. ;) - person lkbaerenfaenger; 16.01.2013
comment
@duebelmann: Подумайте: " 'I won't go out. It's raining.' says Julia". - person georg; 16.01.2013
comment
Что касается примера, который вы добавили, пожалуйста, дайте мне знать, правильно ли я его интерпретирую. Вы утверждаете, что вся эта конструкция является выражением, хотя переменной a присваивается значение. (Что, как я думал, сделает это утверждением) Не имеет значения, скажем, это выражение. Затем вы объявляете функцию и сразу после этого вызываете ее, передавая ей значение 20. Правильно ли это интерпретируется? Я даже не знал, что это возможно, однако на самом деле это будет объявление/вызов функции (который считается оператором) внутри выражения. Я прав? - person lkbaerenfaenger; 16.01.2013
comment
@duebelmann, как и во многих других языках, различные операторы присваивания на самом деле являются просто операторами в грамматике выражений. Одно выражение может включать множество присваиваний переменным (или свойствам объекта). - person Pointy; 16.01.2013
comment
@duebelmann: короче говоря, Javascript - запутанный язык. На самом деле, это очень грязно. Если вы серьезно относитесь к его изучению, будьте готовы обнаружить множество странных вещей как в синтаксисе, так и в семантике. - person georg; 16.01.2013
comment
Мне просто как-то напомнили об этих ответах: stackoverflow.com/a/347435/218196 :) - person Felix Kling; 16.01.2013