首页 > 解决方案 > var __decorator = (this && this.__decorate) || 上的第一个操作数是什么?function() {...} 尝试做什么?

问题描述

当 TypeScript 装饰器(类装饰器)被转译为 JavaScript 时,它会产生以下结果:

var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};

现在,返回var __decorate时分配给变量的是什么?(this && this.__decorate)true

另外,如果它被遗弃,它将如何影响整个代码?

标签: javascripttypescripttypescript-decorator

解决方案


JS 不一定会从逻辑语句中 返回true或返回。如果它是真的,将返回 A,如果 A 是假的,则返回 B。同样,如果它是虚假的,则返回 A,否则返回 B。 falseA || BA && B

两者||&&也是所谓的短路运算符,如果不需要第二个操作数来确定结果,甚至不执行第二个操作数。so(A && A.B)常用于获取的值,A.B同时防止 A未定义,或A = B || C用于设置A是否B已定义,或如果未定义则声明定义C

例如,请参阅MDN了解更多详细信息。

(this && this._decorate)看起来它正在检查是否_decorate已在this. 首先它检查是否this已定义(否则会引发错误)然后检查值。如果this._decorate已定义,则将跳过函数声明(因为现有this._decorate函数将像所有函数一样真实)。

唯一保证返回实际布尔值的 JS 运算符是 not 运算符!


推荐阅读