Javascript 三元运算符的运算符优先级

IT技术 javascript variable-assignment conditional-operator operator-precedence compound-assignment
2021-01-13 18:51:23

我似乎无法将这段代码的第一部分 ( += ) 与三元运算符结合起来。

h.className += h.className ? ' error' : 'error'

我认为此代码的工作方式如下:

h.className = h.className + h.className ? ' error' : 'error'

但这不正确,因为这会在我的控制台中出现错误。

所以我的问题是我应该如何正确解释这段代码?

6个回答
h.className = h.className + (h.className ? ' error' : 'error')

您希望操作员为 工作h.className,最好对此进行具体说明。
当然,应该没有伤害 h.className += ' error',但那是另一回事。

另外,请注意+优先于三元运算符:JavaScript Operator Precedence

我认为应该注意的是,虽然 应该不会造成伤害h.className += ' error',但如果它最初是空的,它也会在字符串的开头留下一个空格。我相信三元运算的目的是产生一个干净的字符串。
2021-03-19 18:51:23
@JMTyler - 这正是我所暗示的 - 如果这一切只是为了从一开始就保留一个空间,我就不值得了。(边缘情况包括精确的 jQuery 或 XPath 选择器)。还是谢谢你。
2021-03-20 18:51:23
@Kobi +1 仅用于操作员优先警告!
2021-03-21 18:51:23

可以这样想:

<variable> = <expression> ? <true clause> : <false clause>

语句的执行方式基本如下:

  1. <expression>计算为true,或者它评估为假的?
  2. 如果<expression>计算结果为真,则将 的值<true clause>分配给<variable><false clause>被忽略,并执行下一条语句。
  3. 如果<expression>计算结果为 false,<true clause>则被忽略并将 的值<false clause>分配给<variable>

在这种语言和其他语言中使用三元运算符实现的重要一点是,无论代码是什么,<expression>在评估时都应该产生一个布尔结果:真或假。

在您的示例的情况下,将我解释中的“分配给”替换为“添加到”,或者对于您使用的任何速记算术(如果有的话)。

请注意确定完美的注释是否合适:) 它跳过了为什么左手表达式首先“组合在一起”的任何解释(即因为+比条件/三元运算符具有更高的优先级(实际上条件运算符几乎总是最后一个)在任何表达式中求值)。
2021-03-15 18:51:23

The+=执行您想要的操作,但在其右侧的三元语句中,它会检查是否h.className为 false,如果未定义则为 false。如果它是真的(即如果已经指定了类名),则错误添加一个空格(即添加一个类),否则添加时不带空格。

可以按照您的建议重写代码,但您需要h.className在三元运算符中指定用于真实性比较,而不是使用其实际值,因此请确保您不要打扰值的串联在进行三元运算的同时:

h.className = h.className + (h.className ? ' error' : 'error');
嗯,是的,undefined这不是的,只是被当作了
2021-04-05 18:51:23

在右手边=操作是从左向右计算的。所以,

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';