Javascript: разница между утверждением и выражением?

Я задал этот вопрос ранее, и, подумав над этой темой, я начал задаваться вопросом, где лежит нечеткая граница между значениями терминов "высказывание" и "выражение". Все ли заявления также являются выражениями? Откуда возвращаются значения в консоли REPL? Кажется, они не всегда имеют интуитивный смысл. Конечно, если вы печатаете 1+1, ты получишь 2, но иногда это не так очевидно, какова логика.

Учитывая, что что-либо, введенное в REPL, производит какое-то значение, означает ли это, что оно может использоваться в исходном коде JS как в качестве выражения, так и в качестве отдельного оператора?

может строка кода, которая может быть использована для _X_ в следующем фрагменте также будет использоваться для _Y_ и наоборот? if(_X_) _Y_

11 ответов

Решение

Все ли заявления также являются выражениями?

"Где бы JavaScript ни ожидал утверждения, вы также можете написать выражение. Такое утверждение называется выражением выражения. Обратное не имеет места: вы не можете написать оператор, где JavaScript ожидает выражение. Например, оператор if не может стать аргументом функции ".

Это из недавнего сообщения Акселя Раушмайера на эту тему: выражения против выражений в JavaScript

Надеюсь, поможет.

Согласно MDN:

Выражение - это любая допустимая единица кода, которая преобразуется в значение.

Таким образом, все, что может быть использовано в качестве значения, является выражением.

Критерий не в том, существуют ли побочные эффекты. Выражения могут определенно иметь побочные эффекты. Например a=2 является выражением, поскольку оно имеет значение (2) и также присваивает значение переменной. Вот почему вы можете делать такие вещи, как:

let a;
let b = 1 + (a = 2); // a is now 2 and b is 3

Один и тот же (текстовый) блок кода может рассматриваться как выражение и утверждение в зависимости от контекста. Например, фрагмент текста function f(){} является выражением в строке 1 и оператором в строке 2 в приведенном ниже коде:

let g = function f() {};
function f() {};

Так что, является ли что-то выражением или утверждением, нельзя (в общем случае) произнести, глядя на текстовый фрагмент кода вне контекста; скорее это свойство узла в синтаксическом дереве и может быть объявлено только после того, как код (мысленно или фактически) проанализирован.

Кроме того, и, возможно, что более важно, операторы функций (или объявления функций) внутри функции f формировать часть контекста выполнения, который создается при выполнении функции f вызывается. Однако функциональные выражения не являются частью контекста выполнения.

Одним из часто упоминаемых результатов этого является то, что объявления функций "поднимаются", а выражения функций - нет.

Более тонкий эффект также можно наблюдать экспериментально в глубоких рекурсиях, учитывая, что операторы функций занимают место в контексте выполнения, тогда как выражения функций - нет. Например, приведенный ниже код использует бесконечную рекурсию функции f, функция f в первом случае включает в себя выражение функции внутри него, во втором случае оно включает объявление эквивалентной функции:

// Function Expression
{
    let i = 0;
    try {

        function f () {
            i++;
            (function g() {})(); // this is an expression
            f();
        }

        f();

    } catch (err) {
        console.log(`Function Expressions case: depth of ${i} reached. Error: ${err.name}`);
    }
}
// Function Declaration
{
    let i = 0;
    try {
        function f () {
            i++;
            function g() {}; // this is a statement
            g();
            f();
        }

        f();

    } catch (err) {
        console.log(`Functions Declarations case: depth of ${i} reached. Error: ${err.name}`);
    }
}

На моей машине я последовательно получаю следующее (в node.js):

Function Expressions case: depth of 17687 reached. Error: RangeError
Functions Declarations case: depth of 15476 reached. Error: RangeError

… Что согласуется с тем фактом, что объявления функций увеличивают объем пространства, необходимого для хранения контекста выполнения, и, таким образом, немного быстрее поглощают пространство стека и, таким образом, немного уменьшают максимальную глубину рекурсии.

Проще говоря, выражения оцениваются для получения значения. С другой стороны, операторы выполняются, чтобы что-то произошло.

Выражение производит или оценивает некоторую ценность.

Примеры выражений:new Date() создает новый объект Date без каких-либо побочных эффектов.[1,2,3] производит новый массив без каких-либо побочных эффектов.5+6 производит новое значение 11. Он просто создает новое значение без каких-либо побочных эффектов.

Оператор производит некоторое поведение или делает что-то, и это также имеет некоторый побочный эффект. На основании побочного эффекта, заявления могут быть классифицированы.

x=5; это утверждение, и здесь побочным эффектом является присваивание или изменение в х.

setTimeout() - запуск таймера является побочным эффектом.

Заявления обычно разделяются точкой с запятой.

Выражение выражения - это выражение, которое имеет некоторый побочный эффект или просто "выражение с побочным эффектом".

Примеры выражения выражения:

x+=6; Это сложное выражение (группа первичных выражений) выполняет присваивание, которое является побочным эффектом, так называемое выражение выражения.

delete a[2];

Выражение: единица кода, которая преобразуется в значение, например, литералы и операторы. Примеры для выражений:

> 3
> 1 + 2
> "expression"
> fn()
> []
> {}


Оператор: блок кода, представляющий одну или несколько инструкций, обычно начинается с зарезервированного для языка ключевого слова и заканчивается, явно или неявно, завершением оператора. Примеры заявлений:

> 3;
> let x = 3;
> if () {}
> for () {}
> while () {}

Все программы на JavaScript состоят из операторов и заканчиваются точками с запятой, кроме операторов блоков, которые используются для группировки нулевых или более операторов. Операторы просто выполняют некоторые действия, но не производят никакого значения или вывода, тогда как выражения возвращают некоторое значение. Когда интерпретатор видит выражение, он извлекает его значение и заменяет выражение новым значением. Заявления используются для манипулирования этими выражениями. Вы можете проверить, является ли это выражением или оператором здесь: JavaScript Parser

Перейдите в консоль браузера (Ctrl + Shift + I или же Command + Shift + I):

Введите код, который вам не понятен.

Если браузер вернет undefined после каждой строки выполнения это утверждение.

Если браузер возвращает любое значение, кроме undefined после каждой строки выполнения это выражение.

Консоль браузера работает так, как будто она использует console.log(statement)для каждой введенной строки кода. Обратитесь к этому для получения дополнительной информации.

Эта процедура предназначена только для проверки.

Но необходимо понимать:

  1. Выражения return значение, заявления нет.

  2. Все выражения являются утверждениями, но не иначе. Вы не можете использовать оператор вместо выражения.

Я настоятельно рекомендую прочитать исчерпывающее сообщение в блоге доктора Акселя Раушмайера
Выражения против операторов в JavaScript
как упомянуто в принятом ответе @ZER0 выше.

Но мой любимый ярлык памяти:

Выражение:
e можно установить E готовиться к Expression
..или же Expressed распечатав это.
Утверждение:
..что-нибудь еще.


Следующее изменено с
Ответ Андерса Касерга на Quora.

Оператор - это полная строка кода, которая выполняет некоторое действие.

E очень E xpression может использоваться как утверждение
(чей эффект заключается в оценке выражения и игнорировании полученного значения).

Но E xpression - это любой фрагмент кода, который e оценивает ценность e,

Выражения могут быть объединены "горизонтально" в большие выражения с помощью операторов.
E имеет горизонтально плоский верх

Большинство утверждений нельзя использовать как выражения.

Выражения могут быть объединены только "вертикально", написав одно за другим, или с блочными конструкциями.
S работает вертикально по сравнению.


От Quora Post Райаном Ламом:

Вот общее правило: если вы можете распечатать его или присвоить переменной, это выражение. Если вы не можете, это утверждение.

Вот несколько примеров выражений:

2 + 2
3 * 7
1 + 2 + 3 * (8 ** 9) - sqrt(4.0)
min(2, 22)
max(3, 94)
round(81.5)
"foo"
"bar"
"foo" + "bar"
None
True
False
2
3
4.0

Все вышеперечисленное можно распечатать или присвоить переменной.

Вот несколько примеров утверждений:

if CONDITION:
elif CONDITION:
else:
for VARIABLE in SEQUENCE:
while CONDITION:
try:
except EXCEPTION as e:
class MYCLASS:
def MYFUNCTION():
return SOMETHING
raise SOMETHING
with SOMETHING:

Ни одна из вышеперечисленных конструкций не может быть присвоена переменной. Они являются синтаксическими элементами, которые служат цели, но сами по себе не имеют никакой внутренней "ценности". Другими словами, эти конструкции ни для чего не "оценивают". Например, попытка сделать что-либо из следующего будет абсурдной и просто не сработает:

x = if CONDITION:
y = while CONDITION:
z = return 42
foo = for i in range(10):

У нас есть следующие два типа выражений:

1. Булево выражение используется для выполнения блока операторов. введите описание изображения здесь

2. Арифметическое выражение используется для присваивания переменных, которое также действует как оператор.

Например: number = number + 1;

Короче говоря, выражение — это значение, утверждение — это поведение.

Позвольте мне показать вам несколько наивных примеров.

Следующий код определяет файл . это называется let statementво главе с letключевое слово. Здесь 1является .

      // statement
// |---------|
   let n = 1 ;
//        |-|
//        expression

И этим руководит forключевое слово. Он поставляется с некоторыми вложенными выражениями и операторами.

      //      expression(1)
//      |-----------|
   for (num in numArr) {                 //--+
                                         //  |
      sum += (num * 3); // statement(2)  //  |
//            |-----|                    //  |statement(1)
//            expression(2)              //  |
                                         //  |
   }                                     //--+

Итак, statementпредставляет собой блок инструкций, сообщающий компьютеру , что делать . for statement, while statement, if statementвсе они являются действиями , другими словами , задачами или поведением .

Но для expression, мы говорим о значениях, ценностях, объектах или некоторых процедурах, которые могут производить значение, например функцию.

      1 + 2
(2 + 3) * 5 === 25
new Foo()

Итак, Javascript также имеет function expression. Потому что functionэто value. В следующем коде

  1. Весь фрагмент представляет собой утверждение.
  2. Все после =является выражением.
  3. return width * height;является вложенным оператором.
  4. width * heightявляется выражением.
      const rectArea = function(width, height) {
  return width * height;
};

Фрагмент кода, который производит значение, называется выражением. Каждое значение, которое написано буквально (например, 22 или "психоанализ"), является выражением. Выражение в круглых скобках также является выражением, как бинарный оператор, применяемый к двум выражениям, или унарный оператор, применяемый к одному.

Выражение соответствует фрагменту предложения на человеческом языке, выражение JavaScript соответствует полному предложению. Программа - это список операторов.

Самый простой вид оператора - это выражение, после которого ставится точка с запятой. Это программа:

1;!ложный; Однако это бесполезная программа. Выражение может содержать просто значение, которое затем может быть использовано в коде включения. Заявление стоит само по себе, поэтому оно имеет значение только в том случае, если оно влияет на мир.

Заявление могло иметь побочные эффекты.

https://eloquentjavascript.net/02_program_structure.html

Другие вопросы по тегам