【问题标题】:Javascript. Assign array values to multiple variables? [duplicate]Javascript。将数组值分配给多个变量? [复制]
【发布时间】:2011-10-22 10:04:00
【问题描述】:
var a,b,c;
var arr = [1,2,3];
[a,b,c] = arr;

此代码在 Firefox 中完美运行,结果 a=1、b=2 和 c=3,
但它在 Chrome 中不起作用。是 Chrome 错误还是
它不是有效的 javascript 代码? (我在 javascript 引用中找不到它)

如何修改此代码以使其适用于 Chrome,同时对它的损坏最小?
(我真的不喜欢一直写 a = arr[0]; b = arr[1]... 或与 arr.shift() 相同)

附:这只是一个示例代码,在实际代码中
我从我的代码之外的某个地方得到了 arr 数组

【问题讨论】:

  • Chrome 会发生什么?您收到什么错误消息?
  • 它给了我以下信息:ReferenceError 参数:Array[0] 消息:“—”堆栈:“—”类型:“invalid_lhs_in_assignment”proto:错误
  • FWIW,jslint.com 说它很好(在修复了一些空格之后;虽然我不知道它会评估什么),但 jshint.com 说这是一个糟糕的任务。
  • 有趣!这是一个奇怪的结构,我很惊讶它适用于大多数浏览器。好奇地知道这甚至是有效的 JS(显然是有效的,但可能是由于引擎的实现)。
  • 关于您可以在 Chrome 中使用哪些代码的实际问题,这里是之前的讨论:stackoverflow.com/questions/204444/…

标签: javascript arrays variable-assignment


【解决方案1】:

这是 JavaScript 1.7 的一项新功能,称为 Destructuring assignment

解构赋值可以使用反映数组和对象字面量构造的语法从数组或对象中提取数据。

对象和数组字面量表达式提供了一种创建临时数据包的简单方法。一旦你创建了这些数据包,你就可以以任何你想要的方式使用它们。您甚至可以从函数中返回它们。

使用解构赋值可以做的一件特别有用的事情是在单个语句中读取整个结构,尽管您可以用它们做很多有趣的事情,如以下充满示例的部分所示。

您可以使用解构赋值,例如,交换值:

var a = 1;
var b = 3;
[a, b] = [b, a];

此功能类似于 Perl 和 Python 等语言中的功能。

不幸的是,根据this table of versions 的说法,JavaScript 1.7 尚未在 Chrome 中实现。但它应该在:

  • FireFox 2.0+
  • IE 9
  • Opera 11.50。

在这个 jsfiddle 中亲自尝试一下:http://jsfiddle.net/uBReg/

我在 Chrome(失败)、IE 8(失败)和 FireFox 5(根据 wiki 表有效)上对此进行了测试。

【讨论】:

  • 解构(很可能)在 ECMAScript 的下一个版本中是 coming as an official language feature,因此假设提案成立,Google Chrome 肯定会实现。
  • 那太好了; JavaScript 1.7+ 中有一些令人兴奋的功能......不幸的是,由于这些浏览器不兼容,它们目前不能用于“现实世界”应用程序。
  • 可能不会。说a = arr[0]; b = arr[1];a = arr.shift(); 更有效,因为shift 改变了数组。但两者都可以——我会选择你喜欢的风格。
  • Javascript 版本表表明这适用于 IE9,但对我来说,它会引发错误:'Invalid Left-Hand Assignment.'
  • 一次性声明和赋值:let [a, b] = [1, 2];
【解决方案2】:

@Justin 已经回答了,这仅适用于 Javascript 1.7。以下是在广泛使用的浏览器中模拟它的试验:

function assign(arr, vars) {
    var x = {};
    var num = Math.min(arr.length, vars.length);
    for (var i = 0; i < num; ++i) {
        x[vars[i]] = arr[i];
    }
    return x;
}
var arr = [1, 2, 3];
var x = assign(arr, ['a', 'b', 'c']);
var z = x.a + x.b + x.c;  // z == 6

我不知道它有多大用处。

【讨论】:

  • 这真的很有帮助,谢谢!
猜你喜欢
  • 2011-08-19
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多