如在JavaScript 1.7的Mozilla changlog中所见,它们已添加了解构分配。可悲的是,我不太喜欢这种语法(为什么要两次编写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没有指针。在正方面,如果值不匹配,则可以分配默认值。另请注意,此解决方案不会尝试对数组进行 slice 。所以你不能做类似{first: 0, rest: 0}的事情。但这很容易做到,只要有人愿意这样做。

有什么更好的解决方案?

最佳答案

首先,var [a, b] = f()在JavaScript 1.7中可以正常工作-试试吧!

其次,您可以使用with()稍微简化使用语法:

var array = [1,2];
with (assign(array, { var1: null, var2: null }))
{
   var1; // == 1
   var2; // == 2
}

当然,这不允许您修改现有变量的值,因此恕我直言,它比JavaScript 1.7功能要有用得多。在我现在正在编写的代码中,我只是直接返回对象并引用它们的成员-我将等待1.7功能变得更广泛可用。

10-07 19:10
查看更多