从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}
这样做。但如果有人想要这种行为,那么很容易就可以做到。
有更好的解决方案吗?
var [a,b] = [1,2];
会导致语法错误。 - Marcinwith
可能会存在安全隐患,正如 Mozilla 的官方文档 所述:“不建议使用 with,在 ECMAScript 5 严格模式下是被禁止的。推荐的替代方法是将想要访问其属性的对象分配给一个临时变量。” - Michael Miorwith
也是不允许的,而严格模式是一个非常有用的模式... - T.J. Crowder