能否从数组中同时赋值给多个变量?

45

在JavaScript中,从数组中赋值给多个变量的方法是否是标准的? 在Firefox和Opera中,可以这样做:

var [key, value] = "key:value".split(":");
alert(key + "=" + value); // will alert "key = value";

但是在IE8或Google Chrome中无法工作。

有没有人知道在其他浏览器中不使用临时变量的好方法?

var tmp = "key:value".split(":");
var key=tmp[0], value=tmp[1];
这是将会在未来的 JavaScript 版本中出现,还是只是 Firefox 和 Opera 的自定义实现?

冒号分割安全吗?如果值中有一个冒号怎么办? - Nosredna
2
嗨,不用担心冒号。那只是一个随机的例子。我只是想知道是否可以从数组中分配给多个变量。或者在不久的将来可能会实现这个功能。 - gregers
7个回答

26

解构赋值在ECMAScript 2015(又称ES6)中被标准化。但是并不是所有浏览器都已经实现了解构赋值(截至2016年3月),即使当它们实现后,用户更新到支持该功能的浏览器也需要一段时间。请参见规范中示例,了解您可以执行的所有强大操作。以下是一些示例:

// Assign from array elements
var [key, value] = "key:value".split(":");
// key => 'key'
// value => 'value'

// Assign from object properties
var {name: a, age: b} = {name: 'Peter', age: 5};
// a => 'Peter'
// b => 5

// Swap
[a, b] = [b, a]
// a => 5
// b => 'Peter'
因为这个功能会破坏向后兼容性,所以您需要将代码转译到所有浏览器上才能使用。许多现有的转译器支持解构。 Babel 是一个非常受欢迎的转译器。请参见Kangax 的浏览器和转译器 ES6 支持表
更多信息: ES6 浏览器支持的兼容性表格 探索 ES6 - 解构章节

9
如果你想知道接下来会发生什么,请阅读关于解构赋值的部分。

https://developer.mozilla.org/en/New_in_javascript_1.7

你可以使用的语言特性始终取决于你的环境。

例如,为Mobile Safari(或其他浏览器的Web堆栈,如Palm Pre、Android等)或AIR开发比为整个Web开发更可预测(在整个Web开发中,你仍然需要考虑甚至是IE6)。


一个跨浏览器的解决方案是初始化一个数组,其中包含您想要以window.variable格式填充的变量列表,然后只需循环遍历即可。不过我无法想象为什么要这样做。似乎总会有更好的解决方案。

1
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/New_in_javascript_1.7#Destructuring_assignment 真是我一直在寻找的!我试着阅读 EcmaScript 规范,但那有点难以理解。Mozilla 的文档非常好!谢谢 :) - gregers

5

1
另一个很好的例子可能是:let sentence = 'Hello World'; let [hello, world] = sentence.split(' '); 就像在Python中使用的方式一样。 - Harlin

4

我刚好有同样的问题,作为自己的练习,我想出了以下解决方案:

var key, value;

(function(arr){
  key=arr[0]; 
  value=arr[1];
})("key:value".split(":"));

alert(key + "=" + value);

在我看来很丑,我宁愿使用临时变量(实际上,我在这里仍然使用了一个临时变量)。

编辑:现在Chrome支持了。至于IE8:我们还关心它吗?


1

我认为这在跨浏览器方面是不可能的。我所知道的最好的方法可能只能在某些情况下有所帮助:

// we'll pretend you don't need the key.
var value = "key:value".split(":")[1];

0

我认为它应该成为新规范的一部分,但是这需要长时间的阅读... :p

key = "key:value".split(":")[0];
value = "key:value".split(":")[1];

我能想到的唯一选择。


1
那不是一种替代方案,Gregers 在他的问题中提到了可能的解决方案。 - Dan Lew
使用临时变量是更好的选择! - nickf
他指出,可以使用一个临时变量来实现这一点,但是在这种方法中并不需要。 - Dmitri Farkov
1
调用两次split()?你认为这样更好吗? - Dan Lew
我同意使用临时变量是更好的选择,但问题是要寻找替代方案,这是我所能想到的唯一方案。 - Dmitri Farkov
显示剩余2条评论

0

我不知道你是如何使用它的,但如果我能够确定“键:值”字符串的格式,我会倾向于使用JSON将字符串评估为必要的对象:

var obj = eval("{'key':'key_str', 'value':'val_str'}");
alert(obj.key + "=" + ojb.value);  //alerts "key_str=value_str

2
抱歉问题有点混乱,但我特别想从数组中分配给多个变量。split函数将返回一个数组。顺便说一句,eval是邪恶的 ;) - gregers
啊,我明白了。split() 只是为了问题而存在,以获取您的示例数组。那么为什么 eval 被称为邪恶?它不安全,但在 JavaScript 中也没有任何东西是安全的。 - jrb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接