ostoh
ostoh

Reputation: 53

ESLint throws an error when trying to assign multiple variables to the same value

Why does ESLint throw a Parsing error: Unexpected token , after a variable declaration on this line of code?

const a, b, c = 1;

My .eslintrc.json looks like this;

{

    "env": {
        "browser": true,
        "es6": true,
        "jquery": true,
        "commonjs": true
    },
    "extends": [
        "airbnb-base",
        "prettier"
    ],
    "parserOptions": {
        "ecmaVersion": 6,
        "sourceType": "script"
    },
    "plugins": ["prettier"],
    "rules": {
        "prettier/prettier": "error",
        "semi": ["error", "always"],
        "quotes": ["error", "double"]
    }

}

Upvotes: 2

Views: 899

Answers (1)

FZs
FZs

Reputation: 18609

You cannot do that in JS.

If multiple variables listed in a variable declaration (either var, let or const), each value has its own initializer, so it's impossible to assign a single value to multiple variables in a single declaration statement, without repetition.

If an initializer is missing (no = value part present), the variable will be set to undefined.

So if you used let, then c would become 1, while a and b would be undefined:

let a, b, c = 1;

console.log(a, b, c) //undefined undefined 1

However, omitting the initializer in a const declaration throws an error (it doesn't make too much sense to assign undefined to a constant, right?)

Therefore, your code fails (not just in ESLint, but in any JS runtime that correctly implements the ECMAScript standard):

const a, b, c = 1; //SyntaxError

To assign the same value to multiple variables, you have to either:

  • Repeat the value (this won't work if the value is an object literal (including array literals and function expressions) or returned by a constructor, a factory, or non-pure function):

    const a = 1, b = 1, c = 1;
    
    console.log(a, b, c) //1 1 1

  • Assign the variables from each other (tip: put the one with the shortest name first and repeat that one):

    const a = 1, b = a, c = a;
    
    console.log(a, b, c) //1 1 1

  • Use let:

    let a, b, c;
    a = b = c = 1
    
    console.log(a, b, c) //1 1 1

  • Destructure an infinite iterator (that seems useful in case of a very large number of variables):

    function* repeatForever(v) {
        while(true) 
            yield v;
    }
    
    const [a, b, c] = repeatForever(1);
                                                       // ^--- Value
    
    console.log(a, b, c) //1 1 1

Upvotes: 5

Related Questions