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