我似乎无法将这段代码的第一部分 ( += ) 与三元运算符结合起来。
h.className += h.className ? ' error' : 'error'
我认为此代码的工作方式如下:
h.className = h.className + h.className ? ' error' : 'error'
但这不正确,因为这会在我的控制台中出现错误。
所以我的问题是我应该如何正确解释这段代码?
我似乎无法将这段代码的第一部分 ( += ) 与三元运算符结合起来。
h.className += h.className ? ' error' : 'error'
我认为此代码的工作方式如下:
h.className = h.className + h.className ? ' error' : 'error'
但这不正确,因为这会在我的控制台中出现错误。
所以我的问题是我应该如何正确解释这段代码?
h.className = h.className + (h.className ? ' error' : 'error')
您希望操作员为 工作h.className
,最好对此进行具体说明。
当然,应该没有伤害 h.className += ' error'
,但那是另一回事。
另外,请注意+
优先于三元运算符:JavaScript Operator Precedence
可以这样想:
<variable> = <expression> ? <true clause> : <false clause>
语句的执行方式基本如下:
<expression>
计算为true,或者它评估为假的?<expression>
计算结果为真,则将 的值<true clause>
分配给<variable>
,<false clause>
被忽略,并执行下一条语句。<expression>
计算结果为 false,<true clause>
则被忽略并将 的值<false clause>
分配给<variable>
。在这种语言和其他语言中使用三元运算符实现的重要一点是,无论代码是什么,<expression>
在评估时都应该产生一个布尔结果:真或假。
在您的示例的情况下,将我解释中的“分配给”替换为“添加到”,或者对于您使用的任何速记算术(如果有的话)。
The+=
执行您想要的操作,但在其右侧的三元语句中,它会检查是否h.className
为 false,如果未定义则为 false。如果它是真的(即如果已经指定了类名),则错误添加一个空格(即添加一个新类),否则添加时不带空格。
可以按照您的建议重写代码,但您需要h.className
在三元运算符中指定用于真实性比较,而不是使用其实际值,因此请确保您不要打扰值的串联在进行三元运算的同时:
h.className = h.className + (h.className ? ' error' : 'error');
在右手边=
操作是从左向右计算的。所以,
g.className = h.className + h.className ? ' error' : 'error';`
相当于
h.className = (h.className + h.className) ? ' error' : 'error';
相当于
h.className += h.className ? ' error' : 'error';
你必须在括号中分隔三元语句
h.className = h.className + (h.className ? ' error' : 'error');
if (h.className) {
h.className = h.className + ' error';
} else {
h.className = h.className + 'error';
}
应该相当于:
h.className += h.className ? ' error' : 'error';