JavaScript中的解构赋值

And*_*sen 16 javascript destructuring variable-assignment

正如在JavaScript 1.7的Mozilla changlog中可以看到的,他们已经添加了解构分配.可悲的是,我不是很喜欢这种语法(为什么要写a和b两次?):

var a, b;  
[a, b] = f();
Run Code Online (Sandbox Code Playgroud)

这样的事情会好很多:

var [a, b] = f();
Run Code Online (Sandbox Code Playgroud)

这仍然是向后兼容的.类似Python的解构不会向后兼容.

无论如何,我能够想出的最好的JavaScript 1.5解决方案是:

function assign(array, map) {
    var o = Object();
    var i = 0;
    $.each(map, function(e, _) {
        o[e] = array[i++];
    });
    return o;
}
Run Code Online (Sandbox Code Playgroud)

其工作方式如下:

var array = [1,2];
var _ = assign[array, { var1: null, var2: null });
_.var1; // prints 1
_.var2; // prints 2
Run Code Online (Sandbox Code Playgroud)

但这真的很糟糕,因为_没有任何意义.它只是一个存储名称的空壳.但遗憾的是它需要因为JavaScript没有指针.在正面,您可以在值不匹配的情况下指定默认值.另请注意,此解决方案不会尝试切片阵列.所以你不能做类似的事情{first: 0, rest: 0}.但如果有人想要这种行为,那很容易做到.

什么是更好的解决方案?

Sho*_*og9 23

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

其次,你可以顺利进行,使用语法略有使用with():

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

当然,这不允许你修改现有变量的值,所以恕我直言,它比JavaScript 1.7功能更有用.在代码中,我正在写现在,我只返回对象直接和参考其成员-我会等待1.7功能越来越广泛.

  • @Marcin:JavaScript 1.7中是[Mozilla的唯一的语言(http://stackoverflow.com/questions/1330498/what-is-cross-browser-support-for-javascript-1-7s-new-features-specifically- AR). (9认同)
  • 请注意,`with`可能很危险,因为[Mozilla自己的文档](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/with)声明"不建议使用with,并且在ECMAScript 5严格模式下被禁止.建议的替代方法是将要访问其属性的对象分配给临时变量." (3认同)
  • 截至今天`var [a,b] = [1,2];`导致Chrome中出现语法错误. (2认同)
  • 将于2015年中左右在ECMAScript 6中提供,请参阅http://en.wikipedia.org/wiki/ECMAScript (2认同)
  • 在严格的模式中也禁止使用`with`,这是一个非常有用的*模式... (2认同)