如何缩短这个条件?

How can this conditional be shortened?

if (!this.initialized || (typeof this.activeId !== 'undefined' && options.qualification_id !== this.activeId)) {
    //Stuff
}

如果 this.initialized 标志为假或 this.activeId 值与 options.qualification_id 不同,我想执行代码。我必须检查是否定义了 this.activeId,因为在 undefined !== this.activeId 的情况下,Javascript 将 return 为真。以上是我想出的条件,但我讨厌它有多长。写它的最短方法是什么?

如果 this.activeId 定义时的有效值全部为真(例如,它不能是 0falsenull),您可以使用:

if (!this.initialized || this.activeId && options.qualification_id != this.activeId)

让我们看看你能做些什么来缩短这个

(!this.initialized || (typeof this.activeId !== 'undefined' && options.qualification_id !== this.activeId))

首先,您可以删除内括号。根据 operator precedence table,逻辑 AND 比逻辑 OR 有一个 "higher precedence"。换句话说,括号将由口译员为您添加。所以,你的条件变成:

(!this.initialized || typeof this.activeId !== 'undefined' && options.qualification_id !== this.activeId)

好不了多少。您可以做的另一件事是利用 JS 类型转换。 undefined 值是错误的(被评估为 false),您的条件可以变为:

(!this.initialized || this.activeId && options.qualification_id !== this.activeId)

但是,这可能会插入一个静默错误,因为 0activeId 也会被评估为 false。您可以使用 in 运算符解决此问题,该运算符检查 属性 是否存在于对象或其原​​型之一上(以确保 属性 不是来自其中一个它的原型你可以使用 hasOwnProperty 方法代替)。

(!this.initialized || 'activeId' in this && options.qualification_id !== this.activeId).

老实说,这对我来说并没有那么好。通常,当行变得太长时,将其分成多行以增加可读性。

var qualificationIsDifferent = options.qualification_id !== this.activeId;
var isNotActive = this.hasOwnProperty('activeId') && qualificationIsDifferent;
var shouldDoStuff = !this.initialized || isNotActive;

if ( shouldDoStuff ) { ... }

请注意,使用上述方法会失去 short-circuit evaluation 的一些好处。 这真的取决于你的目标,有时更冗长意味着更易读。