将数组项用作对象中的键时出现意外的令牌错误

Unexpected Token Error when using array items as keys in an object

本文关键字:意外 错误 令牌 作对 对象 数组      更新时间:2023-09-26

在Chrome中,以下JavaScript代码引发意外令牌错误:

var somearray = ["foo","bar"];
var someassoc = {somearray[0]:somearray[1]};

抛出的错误:

Uncaught SyntaxError: Unexpected token [

相反,我希望它应该为该键创建一个键为somearray[0]的对象和一个项为somearray[1]的对象。

那么,为什么会发生这种情况呢?Unexpected Token通常意味着一个括号放错了地方,等等,但这里的情况并非如此。

JS对象文字的键必须是静态键,或者是包含在[]中的表达式(需要ES2015支持)。

代码的问题在于somearray[0]密钥无效。

因此,如果你需要一个ES5方式,你可以将其重写为

var somearray = ["foo","bar"];
var someassoc = {};
someassoc[somearray[0]] = somearray[1];

对于ES2015,您使用

var somearray = ["foo","bar"];
var someassoc = { [somearray[0]]: somearray[1]};

标准的相关部分:

  • 12.2.6对象初始化程序
  • 12.2.6.3静态语义:包含
  • 11.6.1标识符名称

简而言之:密钥必须是有效的标识符。

在JavaScript中,当声明对象时,键名应该始终是一个简单的字符串,例如:

var object = {'key': 'Hello World'};

然而,如果您想使用动态的密钥名称,如somearray[0],那么您所需要做的就是将someassoc声明为对象:

var someassoc = {};

然后,通过以下操作设置键值组合:

someassoc.key = 'Hello World';

someassoc['key'] = 'Hello World';

在您的情况下,将是:

someassoc[somearray[0]] = somearray[1];

仅此而已:)