解构分配在JavaScript
-
03-07-2019 - |
题
可以看出,在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/ 上运行的代码)