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

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

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

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

5 ответов

Решение

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

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

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

x = y = z = 2;

Его также можно использовать так:

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

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

y = z;
x = 2*z;

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

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

  1. Оценить VariableDeclarationList.
  2. Возврат (нормальный, пустой, пустой).

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

Оператор присваивания (т. Е. Знак равенства) (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 Ключевое слово с выражением называется объявлением. Объявления - это действия, которые не оценивают значение, даже не определенное (даже если ваша консоль печатает неопределенное). Кроме того, объявления не могут появляться там, где JavaScript ожидает выражения, как показали другие ответы на этот пост.

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

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

но x=5 является expression который присваивает 5 х. как нет xJavaScript неявно создает глобальный x в нормальном коде

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

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

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

a = x = y = 5;

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

a = var x = y = 5;

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

var x = y = 5;
a = x;

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

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

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