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

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

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

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

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

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

3 ответа

Решение

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

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

Второй называется деструктуризацией:

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

Для тех, кто знаком с 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;

То, на что вы смотрите, является деструктурирующим заданием. Это форма сопоставления с шаблоном, как в 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];

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

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

let {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;

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

Это разрушающее задание в 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); // правда

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

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

Ничего не найдено на {Foo},

Другие вопросы по тегам