如何缩短这个条件?
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
定义时的有效值全部为真(例如,它不能是 0
、false
或 null
),您可以使用:
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)
但是,这可能会插入一个静默错误,因为 0
的 activeId
也会被评估为 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 的一些好处。
这真的取决于你的目标,有时更冗长意味着更易读。
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
定义时的有效值全部为真(例如,它不能是 0
、false
或 null
),您可以使用:
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)
但是,这可能会插入一个静默错误,因为 0
的 activeId
也会被评估为 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 的一些好处。 这真的取决于你的目标,有时更冗长意味着更易读。