javascriptobjectvariable-assignment

Is chained assignment of an array literal the same as multiple separate assignments repeating the literal expression?


Am not new to JS or its syntax, but sometimes, the semantics of the language has me stumped at times. At work today, a colleague mentioned this:

var a = b = [];

is not the same as

var a = [], b = [];

or

var a = []; var b = [];

since the first version actually assigns the reference to an empty array to a and b. I couldn't quite accept this as true, but I'm not sure. What do you all think?


Solution

  • Yes, they're not the same. var a = b = [] is equivalent to

    var a;
    b = [];
    a = b;
    

    Not only do both a and b get assigned the same value (a reference to the same empty array), b is not declared at all. In strict mode in ECMAScript 5 and later, this will throw a ReferenceError; otherwise, unless there is already a variable b in scope, b is silently created as a property of the global object and acts similarly to a global variable, wherever the code is, even inside a function. Which is not good.

    You can see this quite easily:

    (function() {
        var a = b = [];
    })();
    
    console.log(b); // Shows []