我知道这是一个非常古老的问题,但我对任何答案都不是 100% 满意,因为它们似乎都不完整。因此,我们再次从第一任校长开始:
用户的总体目标:
总结代码:“我希望在字符串中添加一个error 类名,如果字符串中已经有类名,则可以选择前导空格。”
最简单的解决方案
正如 Kobi 指出的那样,5 年前,在类名中有一个前导空格不会对任何已知浏览器造成任何问题,因此最短的正确解决方案实际上是:
h.className += ' error';
这应该是实际问题的实际答案。
尽管如此,提出的问题是......
1) 为什么会这样?
h.className += h.className ? ' error' : 'error'
条件/三元运算符的工作方式类似于 if 语句,将其 true 或 false 路径的结果分配给变量。
因此该代码有效,因为它被简单地评估为:
if (h.className IS NOT null AND IS NOT undefined AND IS NOT '')
h.className += ' error'
else
h.className += 'error'
2) 为什么会中断?
h.className = h.className + h.className ? ' error' : 'error'
问题指出“在我的控制台中出现 [n] 错误”,这可能会误导您认为代码不起作用。事实上,下面的代码确实会运行,但没有 error,但如果字符串 不是 为空,它只会返回“error”,如果字符串 was 为空,因此不符合要求。
该代码总是生成一个仅包含 ' error' 或 'error' 的字符串,因为它的计算结果为以下伪代码:
if ((h.className + h.className) IS NOT null AND IS NOT undefined AND IS NOT '')
h.className = ' error'
else
h.className = 'error'
原因是加法运算符(普通人的+)具有比条件/三元运算符(15)更高的“优先级”(6)。 我知道数字是倒数的
优先级仅仅意味着语言中的每种类型的运算符都以特定的预定义顺序(而不仅仅是从左到右)进行评估。
如何更改评估顺序:
现在我们知道它为什么会失败,您需要知道如何让它发挥作用。
其他一些答案谈到改变优先级,但你不能。优先级是硬连线到语言中的。这只是一组固定的规则...但是,您可以更改评估顺序...
我们工具箱中可以更改评估顺序的工具是分组运算符(又名括号)。它通过确保括号中的表达式在括号外的操作 before 进行评估来做到这一点。这就是他们所做的一切,但这已经足够了。
括号之所以起作用,仅仅是因为它们(分组运算符)比所有其他运算符具有更高的优先级(“现在有一个级别 0”)。
通过简单地添加括号,您更改评估顺序以确保先执行条件测试,然后再进行简单的字符串连接:
h.className = h.className + (h.className ? ' error' : 'error')
我现在会把这个答案留给其他人看不到的 rust :)