为什么两个 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 : ''
理解为:
解析三进制:
- 条件子句:
'https://api.rest.com/v1/users/' + userId + '/resource/' + resourceId
1.1:这又使用解析串联模式 ¹
- If 子句:
resourceId
- Else 子句:
''
提示:组合表达式时,使用括号来消除运算符的歧义,例如 'https://api.rest.com/v1/users/' + userId + '/resource/' + (resourceId ? resourceId : '')
.
¹ 每个优先级别都有模式,如 *、&&、=== 等。
什么行
'https://api.rest.com/v1/users/' + userId + '/resource/' + resourceId ? resourceId : ''
确实是连接三元运算符之前的所有内容,然后评估该运算结果是否为真(它是),然后 returns 三元运算符的真实分支结果。
Andre 的回答建议您使用括号来获取您期望的操作顺序,这将使您保持单行格式。
我不明白为什么
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 : ''
理解为:
解析三进制:
- 条件子句:
'https://api.rest.com/v1/users/' + userId + '/resource/' + resourceId
1.1:这又使用解析串联模式 ¹ - If 子句:
resourceId
- Else 子句:
''
提示:组合表达式时,使用括号来消除运算符的歧义,例如 'https://api.rest.com/v1/users/' + userId + '/resource/' + (resourceId ? resourceId : '')
.
¹ 每个优先级别都有模式,如 *、&&、=== 等。
什么行
'https://api.rest.com/v1/users/' + userId + '/resource/' + resourceId ? resourceId : ''
确实是连接三元运算符之前的所有内容,然后评估该运算结果是否为真(它是),然后 returns 三元运算符的真实分支结果。
Andre 的回答建议您使用括号来获取您期望的操作顺序,这将使您保持单行格式。