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

javascript ecmascript-6 destructuring javascript-1.7

18699 просмотра

4 ответа

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

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

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

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

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

Автор: timdream Источник Размещён: 16.06.2019 01:24

Ответы (4)


63 плюса

Решение

Обе функции 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;
Автор: Blender Размещён: 08.03.2013 10:09

71 плюса

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

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

Автор: Aadit M Shah Размещён: 08.03.2013 10:44

1 плюс

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

Автор: Deeksha Sharma Размещён: 07.01.2019 12:47

0 плюса

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

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

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

Автор: Jan Hančič Размещён: 08.03.2013 09:48
32x32