在JavaScript数组中通过值获取索引

4

在 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更改为{}空对象,这也可以正常工作并且有意义。我不知道这里发生了什么。

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


这就是编译器编写JavaScript的结果。 - Travis J
实际上这不是编译器生成的代码。请参见我的答案https://dev59.com/j5Pfa4cB1Zd3GeqPEYYp#35075698。 - basarat
2
数组是对象,因此如果你所做的只是使用方括号表示法分配属性,那么两者的行为完全相同。数组具有特殊的length属性,但在其他方面并不特殊(它们继承的属性大多是通用的,并且可以应用于任何适当的对象)。 - RobG
@RobG 谢谢,这正是我想知道的。 - monad98
4个回答

5

This:

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";

接下来可以请求Season:

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

但是,console.log(Seson.length) // 4 这不意味着Season是一个数组吗?那么,如何让数组具有像对象一样的“Spring”属性呢? - monad98
@monad98,你所提出的问题是错误的。那不是编译器生成的JavaScript代码:https://dev59.com/j5Pfa4cB1Zd3GeqPEYYp#35075698 - basarat
1
@monad98 数组也是一个对象,具有一些特定的属性:Array.prototype.length 是最后一个被占用的整数索引 +1。 - c-smile

4

看起来有人正在试图让Season成为一个双向映射。

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

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

是的。但这不是op所质疑的内容。https://dev59.com/j5Pfa4cB1Zd3GeqPEYYp#35075698 - basarat

1
如果你将代码块中的第一个语句更改为var Season = [];,使得Season成为一个数组而不是一个空对象,那么它仍然有效的原因是:数组也是对象,在JavaScript中,你可以在对象上设置任何属性,甚至是数组(只要你没有通过Object.freeze将对象冻结)。因此,表达式Season["Spring"] = 0只是在Season对象上设置了一个名为"Spring"的属性,你可以像在任何其他对象上一样使用Season["Spring"]Season.Spring来访问它。

0
如果我将第一行的Season更改为空对象{},这也可以工作并且是有意义的。
我有一些关于枚举的文档,但你的问题是为什么:
Season = [];

不要使用

Season = {};

实际上是以下TypeScript:

enum Season {
    Spring,
    Summer,
    Fall,
    Winter
}

生成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";感到好奇(这里有相关内容)


谢谢!它对我很有帮助,让我更好地理解了枚举。 - monad98

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