为什么两个评价精细的javascript字符串表达式不能正确评估?

时间:2017-11-22 19:04:14

标签: javascript ternary-operator

我无法理解为什么

1)<form action="tag" autocomplete="on" method="POST"> <input id="search" name="search" type="text" placeholder="Search for tags..."> <input id="search_submit" name="submit-search" type="submit"> </form>

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

都正确评估。

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

resourceId ? resourceId : ''

它导致只评估第二个原始表达式(2)。

这是什么原因?

2 个答案:

答案 0 :(得分:4)

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

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

解析三元:

  1. 条件条款:'https://api.rest.com/v1/users/' + userId + '/resource/' + resourceId 1.1:这反过来使用解析连接模式¹
  2. 如果条款:resourceId
  3. 其他条款:''
  4. 提示:组合表达式时,请使用括号来消除操作符的歧义,例如'https://api.rest.com/v1/users/' + userId + '/resource/' + (resourceId ? resourceId : '')

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

答案 1 :(得分:0)

该行

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

确实是在三元运算符之前连接所有内容,然后将该运算结果计算为truthy或不是(它是),然后返回三元运算符的true分支结果。

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