javascript - 为什么 TypeScript 使用对象属性赋值作为对象键并使用变量赋值作为函数参数?

标签 javascript typescript enums compilation

accepted answer对于标题为 "Compile an enum in TypeScript" 的问题,以下 typescript :

enum Fruit {APPLE, ORANGE};

显示编译为这个 JavaScript:

var Fruit;
(function (Fruit) {
  Fruit[Fruit["APPLE"] = 0] = "APPLE";
  Fruit[Fruit["ORANGE"] = 1] = "ORANGE";
})(Fruit || (Fruit = {}));

第 3 行第 4 行 中,对象属性赋值被用作对象键:

Fruit[Fruit["APPLE"] = 0] = "APPLE";
Fruit[Fruit["ORANGE"] = 1] = "ORANGE";

第 5 行,变量赋值被用作函数参数:

})(Fruit || (Fruit = {}));

据我所知,Fruit = {} 包含在括号中,因此它不是命名参数。

相反,它被评估并作为第一个参数传递给 IIFE,但前提是第一个 Fruitundefined,它可能是(第 1 行: var Fruit;), 因为 TypeScript 不允许重复定义。

这对我来说没有意义,为什么 TypeScript 使用对象属性赋值作为对象键并使用变量赋值作为函数参数?

enum 编译成这样不是更有意义吗:

var Fruit = Fruit || {};
Fruit.APPLE = Fruit[0] = "APPLE";
Fruit.ORANGE = Fruit[1] = "ORANGE";

或者这个:

var Fruit = {};
Fruit.APPLE = Fruit[0] = "APPLE";
Fruit.ORANGE = Fruit[1] = "ORANGE";

代替?

最佳答案

赋值的评估就是值。 IIFE 函数的目的是创建一个以 value -> keykey -> value 两种方式工作的对象。

这里一个有趣的 console.logFruit 本身。


var Fruit;

(function (Fruit) {
    Fruit[Fruit["APPLE"] = 50] = "APPLE";
    Fruit[Fruit["ORANGE"] = 10] = "ORANGE";
})(Fruit || (Fruit = {}));

// main.js
var bowl = [Fruit.APPLE, Fruit.ORANGE];
console.log(Fruit);



如果我们重新开始整个解释:

Fruit 被传递给 IIFE 函数,如果它不存在,它被初始化为一个空对象{}

然后将第一对 key -> value 插入到对象中,结果为:

{
  APPLE: 50,
}

(因为赋值先行执行):

Fruit[Fruit["APPLE"] = 50] = "APPLE";

然后将第二对插入到 Fruit 对象中:

Fruit[50] = "APPLE";

关于javascript - 为什么 TypeScript 使用对象属性赋值作为对象键并使用变量赋值作为函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56021786/

相关文章:

javascript - 我已经尝试使用 jquery 进行简单拆分器但没有工作

javascript - typescript 返回解构?

html - 使用 jsPdf 和 Html2Canvas 在 Angular 中将 HTML 页面转换为 PDF

java - Enum.valueOf 的一般使用

swift - 枚举返回对象(NSError)

javascript - undefined variable ,在渲染方法 React 的 if/else 内部分配

javascript - aloha 界面显示不正确(截图)

javascript - javascript 裁剪图像质量差 (croppie)

node.js - typescript 和子路径导入

c# - 我将使用枚举做什么?