从Mozilla changlog for 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}
之类的事情。但如果有人想要这种行为,那很容易就可以做到。
什么是更好的解决方案?
答案 0 :(得分:23)
首先,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功能变得更加广泛可用。
答案 1 :(得分:4)
您不需要虚拟“_”变量。您可以使用窗口对象范围直接创建“全局”变量:
window["foo"] = "bar";
alert(foo); // Gives "bar"
以下几点:
以下是我提出的建议:
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
答案 2 :(得分:1)
这是我在PHPstorm 10中所做的:
文件 - &gt;设置 - &gt;语言与框架 - &gt; ... 的
...将JavaScript语言版本设置为例如JavaScript 1.8.5 ......
- &GT;单击“应用”。
答案 3 :(得分:0)
在标准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/运行的代码)