Що роблять фігурні дужки в операторах `var {...} = ... '?


117

Не впевнений, що це синтаксис JS, характерний для Mozilla, але я часто знаходив змінні, декларовані таким чином, наприклад, у додаткових документах SDK :

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

і в різних хромованих Javascript ( letзамість цього використовується оператор var),

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

Я вважаю це дуже заплутаним, але я не можу знайти жодної документації щодо обох синтаксисів, навіть у MDN .


@Blender Як би ви шукали цю структуру на symhound.com?
trusktr

1
@trusktr: Трохи пізно: symbolhound.com/…
Blender

Коротка відповідь тут: stackoverflow.com/a/45909752/203704
Cliff Hall

Я добре з базовим деконструюванням. Однак у цьому прикладі ми також присвоюємо значення іншому імені властивості, і синтаксис дуже заплутаний. Це протилежне синтаксису створення об'єктів і додає ще більше плутанини.
Сол

Відповіді:


72

Вони обидва функції 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;

2
З мого експерименту, схоже, var { Hotkey }це рівнозначно var { Hotkey: Hotkey }. Дякуємо, що знайшли документацію!
timdream

@timdream: У мене було відчуття, що це щось подібне, але чим це відрізняється var Hotkey = require(...).Hotkey? Або це просто збереження натискань клавіш?
Блендер

виглядає так: - / (
хе-хе

2
Плюс це робить все більш виразним у використанні такого незвичайного синтаксису.
trusktr

Другий - "Деструкція об'єктів", референція на developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
IcyBrk

80

Те, що ви дивитесь, - це завдання, що руйнує. Це форма відповідності шаблону, як у 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;

Це все, що там є.


12
+1 для прикладів руйнування об'єкта, вони дуже корисні. У прикладах MDN показують тільки масив деструктурірующіе.
Блендер

@Blender - Вони надають приклади руйнування об'єктів. Подивіться на циклічне перегляд значень у масиві об'єктів .
Аадіт М Шах

Я мав на увазі var {a, b, c} = ascii;синтаксис.
Блендер

Цей останній приклад насправді дивний, тому що зазвичай зліва від товстої кишки - те, що призначається.
Кертіс

1

Це руйнівне завдання у Javascript та є частиною стандарту ES2015. Він розпаковує або витягує значення з масивів або властивостей з об'єктів у різні змінні. Наприклад: знищення масиву

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

// з деструкцією var [один, два, три] = foo

Наприклад: руйнування об'єктів

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

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

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

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


0

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

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

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


Вибачте, я подумав, що ви розпитуєте про обидва ... Мій google-fu виходить з ладу, коли мова йде про {Foo}: /
Ян Ханчич

Я теж: - / Google не індексує {і }.
timdream
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.