Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Constant declaration with block

Recently I was looking into Firefox Add-on Builder SDK sources, and stumbled on such constants declaration:

const { getCodeForKey, toJSON } = require("../../keyboard/utils");

I could find information about CommonJS Modules, but left part of this assignment slightly confuses me, since it must be language specific, and I couldn't google anything on that.

Can someone point me to some specification/draft that explains what's going on here?

like image 377
Nash Bridges Avatar asked Apr 17 '12 21:04

Nash Bridges


People also ask

What is const {} in JS?

The const declaration creates a read-only reference to a value. It does not mean the value it holds is immutable—just that the variable identifier cannot be reassigned. For instance, in the case where the content is an object, this means the object's contents (e.g., its properties) can be altered.

Does const have block scope?

Variables defined with const cannot be Redeclared. Variables defined with const cannot be Reassigned. Variables defined with const have Block Scope.

What is declaration of constant?

A constant holds a value that does not change. A constant declaration specifies the name, data type, and value of the constant and allocates storage for it. The declaration can also impose the NOT NULL constraint.

How do you declare a constant syntax?

The const keyword Variables can be declared as constants by using the “const” keyword before the datatype of the variable. The constant variables can be initialized once only. The default value of constant variables are zero.


1 Answers

This is a destructuring assignment, something that is currently only implemented by the SpiderMonkey JavaScript engine which is used by Firefox. Here is how it works with arrays:

// Destructuring assignment
[a, b] = foo;

// Equivalent code
a = foo[0];
b = foo[1];

And here is how it works with objects:

// Destructuring assignment
{a, b} = foo;

// Equivalent code
a = foo.a;
b = foo.b;

A slightly more elaborate example:

// Destructuring assignment
{name: a, address: {line1: b}} = foo;

// Equivalent code
a = foo.name;
b = foo.address.line1;

So your code example is equivalent to:

var utilsExports = require("../../keyboard/utils");
const getCodeForKey = utilsExports.getCodeForKey;
const toJSON = utilsExports.toJSON;

It is merely a more convenient way to write it.

like image 98
Wladimir Palant Avatar answered Sep 21 '22 09:09

Wladimir Palant