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 author states that we should realize that by using the Node's REPL, the following would return undefined:
var a = 2
(undefined)
while the code below will return '2' in the REPL:
a = 2
2
why is that? the code right above is not an attribution? how come? If the var 'a' hasn't existed until that point in the code, how come it is not and attribution?
Variables can be declared and initialize without the var keyword. However, a value must be assigned to a variable declared without the var keyword.
var is the keyword that tells JavaScript you're declaring a variable. x is the name of that variable.
Assignment (=) The simple assignment operator ( = ) is used to assign a value to a variable. The assignment operation evaluates to the assigned value. Chaining the assignment operator is possible in order to assign a single value to multiple variables.
Undeclared variables In this case, the code will throw a ReferenceError as the variable is not declared using var keyword. In short, if we access any undeclared variable, the code will cause runtime error.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With