在javascript数组中按值获取索引

时间:2016-01-29 01:09:06

标签: javascript arrays object enums typescript

在typescript中读取'enum',我看到这段代码编译为javascript。

var Season = [];
Season[Season["Spring"] = 0] = "Spring";
Season[Season["Summer"] = 1] = "Summer";
Season[Season["Fall"] = 2] = "Fall";
Season[Season["Winter"] = 3] = "Winter";

console.log(Season.Spring); // 0
console.log(Season[0]); // Spring

并且,如果我在第一行将Season更改为{}空objext,这也有效,这是有道理的。 我不知道发生了什么事。 这是什么?

编辑:是的。这不是编译器生成的。编译器使用空对象。但是,如果我将其更改为空数组。它仍然有效。我的问题是为什么数组也很好。起初我的问题包括两个版本,但有人编辑了问题并删除了对象使用版本。

4 个答案:

答案 0 :(得分:5)

这:

Season[Season["Spring"] = 0] = "Spring";
Season[Season["Summer"] = 1] = "Summer";
Season[Season["Fall"] = 2] = "Fall";
Season[Season["Winter"] = 3] = "Winter";`

在Season对象中创建八个属性:

Season["Spring"] = 0;
Season["Summer"] = 1;
Season["Fall"] = 2;
Season["Winter"] = 3;
Season[0] = "Spring";
Season[1] = "Summer";
Season[2] = "Fall";
Season[3] = "Winter";

在那之后可以要求:

  1. 按文字获取其索引(前四个属性)
  2. 通过索引获取其文本(后四个属性)

答案 1 :(得分:3)

看起来有人正试图让Season成为双向地图。

换句话说,您可以按数字索引或字符串值查找项目。

var season1     = Season[1];        // season1 == 'Summer'
var summerIndex = Season['Summer']; // summerIndex == 1

答案 2 :(得分:0)

  

如果我在第一行将Season更改为{}空objext,这也有效,这是有道理的

我有一些docs about enums,但您的问题是原因:

Season = [];

而不是

Season = {};

实际上是以下TypeScript:

enum Season {
    Spring,
    Summer,
    Fall,
    Winter
}

生成the JavaScript

var Season;
(function (Season) {
    Season[Season["Spring"] = 0] = "Spring";
    Season[Season["Summer"] = 1] = "Summer";
    Season[Season["Fall"] = 2] = "Fall";
    Season[Season["Winter"] = 3] = "Winter";
})(Season || (Season = {}));

正如您所见Season = {}。所以它应该对你有意义。

PS:

不是您的问题,但如果您对Season[Season["Spring"] = 0] = "Spring"; that is covered here感到好奇。

答案 3 :(得分:0)

如果您将代码块中的第一个语句更改为Season,以便Object.freeze是一个数组而不是一个空对象,我将解答为什么它仍然有效的问题。数组也是对象,您可以在JavaScript中设置您喜欢的任何属性,甚至是数组(只要您不通过Season["Spring"] = 0运行对象)。所以表达式Season只是在Season["Spring"]对象上设置名为“Spring”的属性,您可以使用Season.Springimport Vue from './vue'; import MultiLanguage from './vue-multilanguage'; 访问该对象,就像在任何其他对象上一样