Javascript - назначение нескольких переменных объектам с использованием фигурных скобок в объявлении переменных
При взгляде на некоторый код Javascript для SDK надстройки Mozilla (Firefox) я видел вид объявления переменных, которого я раньше не видел:
var { foo, bar } = someFunction("whatever"); // just an example
Посмотрите на фигурные скобки вокруг имени переменной? Оказывается, это способ назначения значений свойств объекта нескольким переменным одновременно. Это похоже на назначение деструктурирования или PHP list
, за исключением свойств объекта вместо массивов.
Я на самом деле нашел это через какую-то ворчание, поскольку на нем, похоже, нет документации. Взгляните на этот код:
function gimmeAnObject() {
return {
foo: "hey",
bar: "sup"
};
}
console.log(gimmeAnObject()); // Object { foo="hey", bar="sup" }
var { foo, bar } = gimmeAnObject();
console.log(foo); // hey
console.log(bar); // sup
Я также обнаружил, что это работает только в Firefox. Вместо этого Chrome выведет ошибку: "Uncaught SyntaxError: Неожиданный токен {". Это объясняет, почему я не видел его до того, как начал изучать дополнительный код Firefox.
Кто-нибудь еще видел такое объявление переменной раньше? Почему я не могу найти документацию? Поскольку он работает только в Firefox, я думаю, что это может быть Mozilla, но я даже не мог найти ничего об этом на MDN. Опять же, может быть, я просто не знал, что искать.
Ответы
Ответ 1
Глядя на ссылки "Destructuring Assignment" (т.е. http://en.wikipedia.org/wiki/JavaScript_syntax#Assignment и http://dailyjs.com/2011/09/12/destructuring/), он выглядит Подобная конструкция представляет собой деструктурирующее назначение.
Википедия:
В Mozilla JavaScript, начиная с версии 1.7, назначение деструктуризации позволяет сразу назначить части структур данных нескольким переменным. Левая часть задания - это шаблон, который похож на произвольно вложенный литерал объекта/массива, содержащий l-lvalues на его листах, которые должны получать подструктуры назначенного значения.
В JavaScript-массивах и объектах более или менее одинаковы, поэтому не удивительно, что конструкция, поддерживаемая для массивов, также поддерживается для объектов.
Ответ 2
Вы не можете этого сделать. Вы должны называть var и делать что-то вроде этого:
var myObj = (function(){
return {
foo: 'foo',
bar: 'bar'
};
})();