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

Bai*_*ijs 116 javascript variable-assignment conditional-operator operator-precedence compound-assignment

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

h.className += h.className ? ' error' : 'error'
Run Code Online (Sandbox Code Playgroud)

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

h.className = h.className + h.className ? ' error' : 'error'
Run Code Online (Sandbox Code Playgroud)

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

所以我的问题是我应该如何正确地插入这段代码?

Kob*_*obi 141

h.className = h.className + (h.className ? ' error' : 'error')
Run Code Online (Sandbox Code Playgroud)

您希望操作员工作h.className,更好地了解它.
当然,不应该受到伤害 h.className += ' error',但这是另一回事.

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

  • 我认为应该注意的是,虽然`h.className + ='error'`没有任何伤害,但如果它最初是空的,它还会在字符串的开头留下一个空格.我相信三元操作的重点是产生一个看起来干净的字符串. (3认同)

Way*_*rts 129

想一想:

<variable> = <expression> ? <true clause> : <false clause>
Run Code Online (Sandbox Code Playgroud)

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

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

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

在你的例子的情况下,在我的解释中用"添加到"替换"已分配给",或者对于你使用的任何简写算法都是类似的,如果有的话.


Dav*_*und 10

+=你想要做什么,但在它的右手三元声明,它会检查是否h.className是falsey,这将是,如果它是不确定的.如果它是真实的(即,如果已经指定了类名),则添加带有空格的错误(即添加类),否则添加没有空格的错误.

代码可以按照你的建议重写,但是你需要h.className在三元运算符中指定用于真实性比较,而不是使用它的实际值,所以请确保你不要理会值的连接在进行三元操作的同时:

h.className = h.className + (h.className ? ' error' : 'error');
Run Code Online (Sandbox Code Playgroud)

  • 好吧,'undefined`不是*false*它只是被视为好像 (13认同)