I was reading the \'learning Node\' book and I was stuck in a very simple issue, one that I haven\'t given too much thought about: assignment in javascript.
The auth
Per ECMA-262 § 12.2, a VariableStatement (that is, var identifier=value
) explicitly returns nothing. Additionally, a VariableStatement is a Statement; Statements do not return values, and it is invalid to put a Statement somewhere an Expression would go.
For example, none of the following make sense because they put a Statement where you need value-yielding Expressions:
var a = var b;
function fn() { return var x; }
Per § 11.13.1, assignment to a variable (identifier=value
) returns the assigned value.
When you write var a = 1;
, it declares a
and initalizes its value to 1
. Because this is a VariableStatement, it returns nothing, and the REPL prints undefined
.
a=1
is an expression that assigns 1
to a
. Since there is no a
, JavaScript implicitly creates a global a
in normal code (but would throw a ReferenceError
in strict mode, since you're not allowed to implicitly create new globals in strict mode).
Regardless of whether or not a
existed before, the expression still returns the assigned value, 1
, so the REPL prints that.
var a = 2
is a statement. Thus it has no value.
You are evaluating a statement list. When evaluating a statement list, the value of the last value-producing statement is returned. http://ecma-international.org/ecma-262/5.1/#sec-12.1 - note the examples at the end of this section. If no statements in the list returned a value, then nothing will be returned (this is undefined
in JavaScript).
The variable statement, does not return a value. http://ecma-international.org/ecma-262/5.1/#sec-12.2
The assignment operator, does return a value (as well as performing the assignment). http://ecma-international.org/ecma-262/5.1/#sec-11.13.1
Just guessing here - this could probably be verified by referring to the ECMAScript 5th Edition spec (but man that thing is a pain) - it probably has to do with the specification of the "var" statement vs assigning attributes to the "global" object.
When you declare a variable and assign a value to it (var a=2
) the returned value is likely "undefined" because that's what the spec says the "var" statement should return.
When you assign a variable to a symbol without using the "var" statement you are actually assigning a value to an attribute of the global object of that name. That is, a=2
is the same as saying window.a=2
and we know that assinging a value to an attribute returns the value assigned.