【问题标题】:Why do two javascript string expressions that evaluate fine apart not evaluate correctly together? [duplicate]为什么两个评估良好的 javascript 字符串表达式不能一起正确评估? [复制]
【发布时间】:2018-05-06 15:07:15
【问题描述】:

我不明白为什么

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

2) resourceId ? resourceId : ''

两者都正确评估。

但是,当我尝试对一行进行评估时:

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

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

这是什么原因?

【问题讨论】:

  • 您不能只将三元条件加到字符串连接上。这不是他们的工作方式。
  • 使用括号
  • 这都是关于运算符优先级的。同样的原因 4 + 5 = 9 和 0 * 4 + 5 不是。

标签: javascript ternary-operator


【解决方案1】:

称为运算符优先级。字符串连接的优先级高于三元运算符。

解析器将表达式'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. 其他子句:''

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

¹ 每个优先级都有不同的模式,例如 *、&&、=== 等。

【讨论】:

    【解决方案2】:

    什么行

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

    does 将三元运算符之前的所有内容连接起来,然后评估该运算结果是否为真(它是),然后为三元运算符返回真分支结果。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 2017-07-16
      相关资源
      最近更新 更多