可以看出,在Safari changlog JavaScript1.7他们有加入解构分配。可悲的是我不是非常喜欢的语法(为什么要写的a和b两次?):

var a, b;  
[a, b] = f();

这样的事情会更好:

var [a, b] = f();

这将仍然是向后兼容的。蟒蛇喜欢解构将不是向后兼容的。

无论如何最佳解决方案JavaScript1.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] = f()在JavaScript 1.7中运行良好 - 试试吧!

其次,您可以使用 with()来平滑使用语法轻微

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

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

其他提示

你不需要伪"_"变量。你可以直接创建"全球"变量通过使用窗口对象的范围:

window["foo"] = "bar";
alert(foo); // Gives "bar"

这里有几点:

  • 我不会命名这个功能 "分配",因为这是太一般 一个术语。
  • 为更接近于JS 1.7法,我会让的功能采取的目标作为第一个 参数和来源为 第二个论点。
  • 使用对象的文字通过的目标的变量是很酷的但可以混淆JS1.7解构在那里的目的地实际上是一个对象并不是一个阵列。我更喜欢只是使用一个逗号分隔的清单的变量名称为一串。

这里就是我想出了:

function destructure(dest, src) {  
    dest = dest.split(",");  

    for (var i = 0; i < src.length; i++) {  
        window[dest[i]] = src[i];  
    }  
}  

var arr = [42, 66];  

destructure("var1,var2", arr); 

alert(var1); // Gives 42
alert(var2); // Gives 66

这是我在PHPstorm 10中所做的:

文件 - &gt;设置 - &gt;语言与框架 - &gt; ...

...将JavaScript语言版本设置为例如JavaScript 1.8.5 ......

- &GT;单击“应用”。

在标准JavaScript中,我们习惯了各种丑陋,使用中间变量模拟解构赋值也不错:

function divMod1(a, b) {
    return [ Math.floor(a / b), a % b ];
}

var _ = divMod1(11, 3);
var div = _[0];
var mod = _[1];
alert("(1) div=" + div + ", mod=" + mod );

但是我认为以下模式更具有风格:

function divMod2(a, b, callback) {
    callback(Math.floor(a / b), a % b);
}

divMod2(11, 3, function(div, mod) {
    alert("(2) div=" + div + ", mod=" + mod );
});

注意,我们不是将两个结果作为数组返回,而是将它们作为参数传递给回调函数。

(请参阅 http://jsfiddle.net/vVQE3/ 上运行的代码)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top