我似乎无法理解这段代码的第一部分 (+=) 与 三元运算符 的结合。
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 运算符优先级
可以这样理解:
<variable> = <expression> ? <true clause> : <false clause>
这个语句的执行方式如下:
<expression>
的计算结果是 true 还是 false?<expression>
计算结果是 true,则将 <true clause>
的值分配给 <variable>
,忽略 <false clause>
,然后继续执行下一条语句。<expression>
计算结果是 false,则忽略 <true clause>
,并将 <false clause>
的值分配给 <variable>
。需要注意的是,在该语言和其他语言中,三元运算符中 <expression>
中的代码应在计算时产生一个布尔结果,即 true 或 false。
对于你的示例,如果使用简写算术运算符,则应将我解释中的 "assigned to" 替换为 "added to" 或类似的内容。
+
比条件/三元运算符具有更高的优先级(实际上,条件运算符在任何表达式中几乎总是最后一个被评估的)。)的解释。 - iCollect.it Ltd+=
的作用是添加字符串,但在它右边的三元语句中,它检查h.className
是否为假值,如果为未定义,则它将是假值。如果它是真值(即如果已指定类名),则添加一个带空格的错误(即添加一个新类),否则添加不带空格的错误。h.className
用于真值比较,而不是在三元运算符中使用其实际值,所以请确保您不要同时处理值的连接和三元操作。h.className = h.className + (h.className ? ' error' : 'error');
undefined
不是 false,只是被视为是。 - David Hedlundg.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';
我想选择韦恩的解释:
<variable> = <expression> ? <true clause> : <false clause>
让我们考虑两种情况:
h.className += h.className ? 'true' : 'false'
h.className = h.className + h.className ? 'true' : 'false'
在上面的代码中,案例1运行正常
然而
案例2,
h.className = h.className + h.className ? 'true' : 'false'
被执行为
h.className = (h.className + h.className) ? 'true' : 'false'
h.className + h.className
=> 被视为三元运算符的表达式,因为三元运算符具有更高的优先级。因此,始终只分配三元表达式的结果。
h.className = h.className + (h.className ? ' error' : 'error')
但是我对所有答案都不完全满意,因为它们似乎都不完整。所以我们再次从基本原理开始:
总结代码:“我希望将一个error
类名添加到一个字符串中,如果字符串中已经有类名,则可以选择在前面加上一个空格。”
正如Kobi指出,五年前,在类名中加入前导空格不会导致任何已知浏览器的问题,因此最短的正确解决方案实际上是:
h.className += ' error';
尽管如此,所提出的问题是...
h.className += h.className ? ' error' : 'error'
true
或false
路径的结果分配给变量。if (h.className IS NOT null AND IS NOT undefined AND IS NOT '')
h.className += ' error'
else
h.className += 'error'
h.className = h.className + h.className ? ' error' : 'error'
' error'
或'error'
的字符串,因为它计算为以下伪代码:if ((h.className + h.className) IS NOT null AND IS NOT undefined AND IS NOT '')
h.className = ' error'
else
h.className = 'error'
+
)的“优先级”(6)比条件/三元运算符(15)要高。我知道这些数字看起来是相反的
优先级意味着语言中每种类型的运算符都按照特定的预定义顺序进行评估(而不仅仅是从左到右)。h.className = h.className + (h.className ? ' error' : 'error')
h.className += ' error'
不会造成任何伤害,但如果初始为空,则会在字符串开头留下一个空格。我相信三元操作的目的是产生一个干净漂亮的字符串。 - JMTyler