在javascript中使用三元运算符连接字符串

它很烦人

以下代码:

var arrays = [1,2,3]; alert('Array has ' + (arrays.length > 0) ? 'multiple':'single' + ' value'); 

警报作为字符串与三元结果连接multiple

但是这段代码:

 var arrays = [1,2,3]; alert('Array has ' + ((arrays.length > 0) ? 'multiple':'single') + ' value'); 

警告,因为Array has multiple value ,其中string与三元结果连接在一起。

我的问题是:

  1. 为什么第一个代码不与字符串连接。
  2. 第一个代码中是否存在语法错误,如果是这样,为什么它不会引发错误。

你的第一个例子是这样解析的

 alert(('Array has ' + (arrays.length > 0)) ? 'multiple':('single' + ' value')); 

给定运算符优先级 +远远高于?:

两个片段在语法上都是正确的,但由于运算符优先级而不同。 三元运算符的优先级低于+

在第一个片段中:

 var arrays = [1,2,3]; alert('Array has ' + (arrays.length > 0) ? 'multiple':'single' + ' value'); 

Javascript评估第一部分'Array has ' + (arrays.length > 0) ,它给出字符串'Array has true' 。 出于条件目的,非空字符串与true相同(通常称为truthy值)。 因为三元运算符中的第一个操作数是真实的,所以整个表达式的值将是表达式'multiple'的值,即在?之间?:

在第二个片段中添加参数时,只需将三元运算符(arrays.length > 0)作为其条件。 这就是代码按预期工作的原因。