Что делают фигурные скобки в выражениях `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}
,