Как видно из журнала изменений Mozilla для JavaScript 1.7, в них добавлено назначение деструктуризации. К сожалению, я не очень люблю синтаксис (зачем писать a и b дважды?):
var a, b;
[a, b] = f();
Что-то вроде этого было бы намного лучше:
var [a, b] = f();
Это все равно будет обратно совместимо. Подобная Python деструктуризация не будет обратно совместимой.
В любом случае, лучшее решение для JavaScript 1.5, которое мне удалось придумать, это:
function assign(array, map) {
var o = Object();
var i = 0;
$.each(map, function(e, _) {
o[e] = array[i++];
});
return o;
}
Который работает как:
var array = [1,2];
var _ = assign[array, { var1: null, var2: null });
_.var1; // prints 1
_.var2; // prints 2
Но это действительно отстой, потому что _ не имеет смысла. Это просто пустая оболочка для хранения имен. Но, к сожалению, это нужно, потому что в JavaScript нет указателей. С положительной стороны вы можете назначить значения по умолчанию в случае, если значения не совпадают. Также обратите внимание, что это решение не пытается нарезать массив. Так что вы не можете сделать что-то вроде {first: 0, rest: 0}
. Но это легко сделать, если кто-то хочет такого поведения.
Какое решение лучше?