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

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

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

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

Ответ 1

Являются ли все выражения выражениями?

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

Это последнее сообщение от Axel Rauschmayer об этой теме: Выражения против операторов в JavaScript

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

Ответ 2

Согласно MDN:

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

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

Критерий не в том, существуют ли побочные эффекты. Выражения могут определенно иметь побочные эффекты. Например. 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() {};

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

Кроме того, и, возможно, что еще более важно, операторы функций (объявления функций a.k.a) внутри функции 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

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

Ответ 3

Выражение создает или оценивает некоторое значение.

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

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

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

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

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

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

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

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

delete a[2];

Ответ 4

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

Ответ 5

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

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


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

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

Ответ 6

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

Ответ 7

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

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

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


Изменено следующее: Ответ Андерса Касегора Кворы.

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

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

Но выражение e - это любой раздел кода, который e оценивает на значение e.

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

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

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


От Quora Post от Ryan Lam:

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

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

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):

Ответ 8

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

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

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

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