Что делают фигурные скобки в операциях `var {...} =...`?

Не уверен, что это специфичный для Mozilla синтаксис JS, но я часто встречал переменные, которые объявлялись таким образом, например, в документации SDK для дополнений:

var { Hotkey } = require("sdk/hotkeys");

и в различных Chrome Javascript (вместо var используется выражение let),

let { classes: Cc, interfaces: Ci, results: Cr, utils: Cu }  = Components;

Я нашел это очень запутанным, но я не могу найти документацию по обоим синтаксисам, даже на MDN.

Ответ 1

Они оба являются функциями JavaScript 1.7. Первый - переменные уровня блока:

let позволяет объявлять переменные, ограничивая область действия блоком, оператором или выражением, на котором оно используется. Это не похоже на ключевое слово var, которое определяет переменную глобально или локально для целой функции независимо от области блока.

Второй называется destructuring:

Назначение деструктуризации позволяет извлекать данные из массивов или объектов с помощью синтаксиса, который отражает конструкцию массива и литералов объектов.
...
Одной из особенно полезных вещей, которые вы можете сделать с назначением деструктуризации, является чтение всей структуры в одном выражении, хотя есть ряд интересных вещей, которые вы можете сделать с ними, как показано в разделе, полном следующих примеров.

Для тех, кто знаком с Python, он похож на этот синтаксис:

>>> a, (b, c) = (1, (2, 3))
>>> a, b, c
(1, 2, 3)

Первый фрагмент кода является сокращением для:

var {Hotkey: Hotkey} = require("sdk/hotkeys");
// Or
var Hotkey = require("sdk/hotkeys").Hotkey;

Вы можете переписать второй кусок кода как:

let Cc = Components.classes;
let Ci = Components.interfaces;
let Cr = Components.results;
let Cu = Components.utils;

Ответ 2

То, на что вы смотрите - это деструктурирующее задание. Это форма сопоставления с образцом, как в Haskell.

Используя назначение деструктурирования, вы можете извлекать значения из объектов и массивов и присваивать их вновь объявленным переменным, используя синтаксис литералов объекта и массива. Это делает код намного более лаконичным.

Например:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var {a, b, c} = ascii;

Приведенный выше код эквивалентен:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var a = ascii.a;
var b = ascii.b;
var c = ascii.c;

Аналогично для массивов:

var ascii = [97, 98, 99];

var [a, b, c] = ascii;

Это эквивалентно:

var ascii = [97, 98, 99];

var a = ascii[0];
var b = ascii[1];
var c = ascii[2];

Вы также можете извлечь и переименовать свойство объекта следующим образом:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var {a: A, b: B, c: C} = ascii;

Это эквивалентно:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var A = ascii.a;
var B = ascii.b;
var C = ascii.c;

Это все, что нужно сделать.

Ответ 3

Это разрушающее задание в Javascript и является частью стандарта ES2015. Распаковывает или извлекает значения из массивов или свойств из объектов в отдельные переменные. Например: разрушение массива

var foo = ["one", "two", "three"];
//without destructuring
var one = foo[0];
var two = foo[1];
var three = foo[2];

//с деструктуризацией var [one, two, three] = foo

Например: разрушение объекта

var o = {p: 42, q: true}; var {p, q} = o;

console.log (р); //42 console.log(q); //правда

//Назначаем новые имена переменных var {p: foo, q: bar} = o;

console.log(Foo); //42 console.log(bar); // правда

Ответ 4

Существует документация для оператора let в MDN: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/let

let похож на var тем, что ограничивает область объявленной переменной. Он позволяет объявлять переменную внутри блока if(){} (или какой-либо другой блок) и иметь эту переменную только "видимую" внутри этого блока (до сих пор JavaScript имеет область действия и не блокирует область как большинство других языков). Таким образом, let в основном является "исправлением" для чего-то, с чем многие сталкиваются. Обратите внимание, что tihs - это функция JavaScript 1.7.

Не нашли ничего на {Foo}.