为什么两个 javascript 求值很好的字符串表达式不能一起正确求值?

Why do two javascript string expressions that evaluate fine apart not evaluate correctly together?

我不明白为什么

1) 'https://api.rest.com/v1/users/' + userId + '/resource/'

2) resourceId ? resourceId : ''

两者都正确评估。

但是,当我尝试在一行上求值时:

'https://api.rest.com/v1/users/' + userId + '/resource/' + resourceId ? resourceId : ''

它只计算第二个原始表达式 (2).

这是什么原因?

这叫做运算符优先级。字符串连接的优先级高于三元运算符。

解析器将表达式 'https://api.rest.com/v1/users/' + userId + '/resource/' + resourceId ? resourceId : '' 理解为:

解析三进制:

  1. 条件子句:'https://api.rest.com/v1/users/' + userId + '/resource/' + resourceId 1.1:这又使用解析串联模式 ¹
  2. If 子句:resourceId
  3. Else 子句:''

提示:组合表达式时,使用括号来消除运算符的歧义,例如 'https://api.rest.com/v1/users/' + userId + '/resource/' + (resourceId ? resourceId : '').

¹ 每个优先级别都有模式,如 *、&&、=== 等。

什么行

'https://api.rest.com/v1/users/' + userId + '/resource/' + resourceId ? resourceId : ''

确实是连接三元运算符之前的所有内容,然后评估该运算结果是否为真(它是),然后 returns 三元运算符的真实分支结果。

Andre 的回答建议您使用括号来获取您期望的操作顺序,这将使您保持单行格式。