可以从数组中分配多个变量吗?

时间:2009-05-25 14:57:10

标签: javascript

它是从JavaScript中的数组分配多个变量的标准方法吗? 在Firefox和Opera中,你可以这样做:

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

但它在IE8或谷歌浏览器中不起作用。

有没有人知道在没有tmp变量的其他浏览器中执行此操作的好方法?

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

这是即将推出的JavaScript版本,还是FF和Opera中的自定义实现?

7 个答案:

答案 0 :(得分:19)

在ECMAScript 2015(a.k.a. ES6)中对解构分配进行了标准化。但并非所有浏览器都已实现解构(截至2016年3月),即使他们这样做,也需要一段时间才能将用户更新到支持的浏览器。请参阅规范中的examples,了解您可以执行的所有令人敬畏的事情。以下是一些:

// 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'

由于此功能会破坏向后兼容性,因此您需要transpile代码才能使其在所有浏览器中都能正常运行。许多现有的转发器支持解构。 Babel是一个非常受欢迎的转录程序。请参阅Kangax´s table of browser and transpiler ES6-support

更多信息:

Compatibility table for ES6 browser support

Exploring ES6 - Destructuring chapter

答案 1 :(得分:8)

如果您想了解即将发生的事情,请阅读“解构分配”一节。

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

您可以使用的语言功能始终取决于您的环境。

开发移动Safari(或其他浏览器的Web堆栈,例如Palm Pre,Android等)或AIR,比开发网络更容易预测(在那里你甚至还需要IE6)考虑到了。)


解决手头问题的跨浏览器解决方案是初始化一个数组,该数组包含要填充window.variable格式的变量列表,然后循环执行。无法想象为什么你会这样做。似乎总会有更好的解决方案。

答案 2 :(得分:3)

我刚才有同样的问题,而且我自己的练习提出了以下内容:

var key, value;

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

alert(key + "=" + value);

对我来说看起来很难看,我宁愿使用temp var(从技术上讲,我在这里使用临时变量)。

答案 3 :(得分:1)

我认为这不可能以跨浏览器的方式实现。我知道在一些情况下可能有用的最好的是:

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

答案 4 :(得分:0)

我认为它应该是新规范的一部分,然后再次阅读......:p

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

只有我能想到的替代方案。

答案 5 :(得分:0)

我不知道你是如何使用它的,但是如果我能够确定我自己的“key:value”字符串的格式,我很想用json将字符串eval到必要的对象中:

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

答案 6 :(得分:0)

使用destructuring assignment,这是ES6的功能:

var [x, y] = [1, 2];
console.log(x, y); // 1 2