Подтвердить что ты не робот

Значение, возвращаемое заданием

Почему обычный оператор присваивания (например, x = 5) возвращает назначенное значение (5 в этом случае), тогда как присвоение в сочетании с объявлением переменной (var x = 5) возвращает undefined?

Я получил возвращаемые значения, выполнив эти инструкции в консоли Javascript браузера Chrome:

> var x = 5;
undefined
> y = 5;
5
4b9b3361

Ответ 1

То, как язык был разработан. Это соответствует большинству языков.

При объявлении переменной ничего, кроме undefined, не имеет смысла, потому что вы никогда не можете использовать ключевое слово var в контексте выражения.

При назначении be expression не a statement полезно, если вы хотите сразу установить много переменных в одно и то же значение:

x = y = z = 2;

Его также можно использовать следующим образом:

x = 2*(y = z); // Set y = z, and x = 2*z

Однако это не самый читаемый код, и он, вероятно, лучше написан как:

y = z;
x = 2*z;

Ответ 2

Это потому, что var x = 5; - это оператор переменной, а не выражение.

Поведение этого оператора описано в Раздел 12.2 Справочника по языку ECMAScript.

  • Оценить VariableDeclarationList.
  • Возврат (обычный, пустой, пустой).

Это в основном возвращаемое значение void.

Ответ 3

Когда вы пишете var x = 5;, он объявляет x и инициализирует его значение 5.

Это VariableStatement, он ничего не возвращает,

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

Ответ 4

Я отредактировал свой ответ из-за комментария и некоторых других ответов.

Оператор присваивания ничего не возвращает... В приведенном ниже примере, первое, что делает JS-парсер, присваивает значение 5 y. Во-вторых, присваивание y х и т.д. Назначение не return (это не функция, а в JS у нее нет синтаксиса С++ для перегрузки поведения оператора). return является более сложным, чем назначение. Конструкция return не только возвращает значение, но и закрывает текущий контекст, заставляя его быть уничтоженным. Также он закрывает любой родительский контекст (шаблон закрытия), если нет другого ребенка, использующего его. Поэтому, пожалуйста, НЕ говорите мне (в комментариях), что оператор присваивания возвращает любое значение. Оператор присваивания в случае JS является только конструкцией языка.

Эта языковая конструкция полезна в цепочках (и поэтому каждый говорит о возвращении):

a = x = y = 5;

Любая необъявленная переменная объявляется автоматически парсером в глобальной области. Если вы явно объявляете переменную, вы не можете в то же время использовать ее в цепочке, например:

a = var x = y = 5;

Правильное использование вышеуказанного кода:

var x = y = 5;
a = x;

Конечно, вы можете использовать скобки, чтобы сделать код более четким, но это не значит, что код ведет себя как функция.

Также ваш пример работает только в консоли JS, которая не возвращается, но печатает результат инструкции или выражения. Это означает, что консоль JS обрабатывает результат объявления переменной как undefined (то же самое при создании функции: function a() {}).

Ответ 5

Оператор присваивания (т.е. знак равенства) (1) присваивает правостороннему операнду (т.е. значение или значение переменной, свойства или функции) в левый операнд (т.е. переменная или свойство), а затем (2) выражение присваивания (например, y = 10) становится простым операндом с тем же значением, что и его правый-операнд (например, 10), пока не будет оценена остальная часть выражения. Это похоже на то, когда вызываемая функция заменяется возвращаемым значением при вычислении выражения (хотя вызовы функций сначала в порядке операций, а операции присвоения - в четырнадцатом):

var x, y, z = 1;
x = z + (y = 2); // x === 3     

function returnTwo () {
    return 2;
}

x = z + returnTwo(); // x === 3

Обратите внимание, что не только x теперь равно 3, но все выражение оценивается как 3.

Цель ключевого слова var - привязать переменные к текущей области. Переменные, объявленные с ключевым словом var, привязаны к области, в которой они объявлены. Ключевое слово var назначает самую левую переменную (или свойство) в качестве ссылки на значение оцененного выражения:

var fun = function () {
    var x = 1;
    var y = x + 1; 
    return y;
}

// The x and y variables are bound to the scope of the fun function.

Использование ключевого слова var с выражением называется объявлением. Объявления - это действия, которые не оцениваются значением, даже не undefined (даже если ваша консоль печатает undefined). Кроме того, объявления не могут появляться там, где JavaScript ожидает выражения, как показали другие ответы на этот пост.