Как видно из Mozilla changlog для 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}
. Но это можно было бы легко сделать, если бы вы хотели этого поведения.
Какое лучшее решение?