Позначення в дужці об’єктів Javascript ({Навігація} =) зліва від призначення


108

Я раніше не бачив цього синтаксису і мені цікаво, що це таке.

var { Navigation } = require('react-router');

Дужки зліва видають синтаксичну помилку:

несподіваний жетон {

Я не впевнений, яка частина конфігурації webpack перетворюється або яка мета синтаксису. Це гармонія? Може хтось мене просвітить?


У ваших webpack.config.jsви , ймовірно, jsx-loaderз harmonyпрапором включений
Paolo Moretti

Відповіді:


112

Це називається завданням деструктування і є частиною стандарту ES2015 .

Синтаксис присвоєння деструктуризації - це вираз JavaScript, який дає можливість витягувати дані з масивів чи об'єктів за допомогою синтаксису, який відображає побудову масиву та літералів об'єктів.

Джерело: Посилання на присвоєння деструктуризації на MDN

Руйнування об'єкта

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

 console.log(p); // 42
 console.log(q); // true 

 // Assign new variable names
 var {p: foo, q: bar} = o;

 console.log(foo); // 42
 console.log(bar); // true

Деструкція масиву

var foo = ["one", "two", "three"];

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

// with destructuring
var [one, two, three] = foo;

4
Дякую. Я збираюся це прийняти і поставити інше питання. Тепер, коли я знаю, що таке синтаксис, я повинен зрозуміти, що він досі не складається в моєму проекті.
Капітан

Webpack використовує Esprima і матиме підтримку для es6, коли Esprima 2.0 опублікується . До цього часу ви можете використовувати один із завантажувачів es6, який компілює його до es5: github.com/conradz/esnext-loader github.com/Couto/6to5-loader github.com/shama/es6-loader
Йоханнес Евальд

2
Я відмовився від цього рішення, оскільки не вдалося вирішити той приклад, який він наводив, який не показаний у рішенні. Перший приклад показує об'єкт, який буквально руйнується. Другий показує масив, що руйнується. Але приклад, що ставиться під сумнів, такий: var {Navigation} = requ ('react-router'); Крім того, у прикладі, який він подав, брекети є непотрібними.
AndroidDev

2
@AndroidDev ви можете запропонувати зміни; ОП, звичайно, здавалося, що відповідь вважає задовільною.
Метт Бал

1
Будь-яка ідея, чому [пере] називання "назад"? Тобто, var {newVarName: oldVarName} = varSource;схоже, { newVarName: varSource.oldVarName }або scope.newVarName = varSource.oldVarName;, але це, очевидно, неправильно. Чи є практична причина наявності старих / існуючих назв зліва від поля :?
ruffin


17
var { Navigation } = require('react-router');

... використовує руйнування для досягнення того ж, що і ...

var Navigation = require('react-router').Navigation;

... але набагато читабельніший.


3
Це безпосередньо відповідає на запитання, і це, мабуть, найкраща відповідь, яку слід прочитати спочатку, тоді як деякі з попередніх відповідей заглиблюються.
Маллорі-Ерік

3
Більш стисло ... так. Більш читабельна - не дуже. Останній приклад є більш чітким із застосуванням більш фундаментальних конструкцій, він легше читається - але для експерта перший є більш ефективним.
Брайан

5

Це нова функція в ES6 для руйнування об'єктів.

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

var { Navigation } = require('react-router');

У цьому випадку require('react-router')метод повертає об'єкт з парою ключових значень щось подібне

{ Navigation: function a(){}, Example1: function b(){}, Example2: function c(){} }.

І якщо ми хотіли б взяти один ключ у тому поверненому об'єкті, скажімо, Navigationдо змінної, ми можемо використовувати для цього об’єкт, що руйнує .

Це стане можливим лише за умови використання ключа.

Отже, після заяви про призначення, локальна змінна Navigationміститимеfunction a(){}

Інший приклад виглядає приблизно так.

var { p, q } = { p: 1, q:2, r:3, s:4 };
console.log(p) //1;
console.log(q) //2;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.