Concaténer une chaîne avec un opérateur ternaire en javascript

C'est ennuyant

Code suivant:

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

Les alertes en tant que multiple où la chaîne n'est pas concaténée avec le résultat ternaire.

Mais ce code:

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

Les alertes étant donné que le Array has multiple value où la chaîne est concaténée avec le résultat ternaire.

Ma question est :

  1. Pourquoi le premier code n'est pas concaténé avec une chaîne.
  2. Y a-t-il une erreur de syntaxe dans le premier code, si oui, pourquoi il ne provoque pas d'erreur.

Votre premier exemple est analysé de cette façon

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

Étant donné que la priorité de l' opérateur de + est bien supérieure à celle de ?: .

Les deux extraits sont syntaxiquement corrects, mais ils diffèrent en raison de la priorité de l'opérateur. L'opérateur ternaire a moins de priorité que + .

Dans le premier extrait:

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

Javascript évalue la première partie 'Array has ' + (arrays.length > 0) , qui donne la chaîne 'Array has true' 'Array has ' + (arrays.length > 0) 'Array has true' . À des fins conditionnelles, la chaîne non vide est la même que la true (généralement appelée valeur de vérité ). Parce que le premier opérande dans l'opérateur ternaire est vrai, la valeur de l'expression entière sera la valeur de l'expression 'multiple' , c'est-à-dire entre les ? Et le :

Lorsque vous ajoutez les paramètres dans le deuxième extrait, vous faites que l'opérateur ternaire prenne uniquement (arrays.length > 0) comme condition. C'est pourquoi le code fonctionne comme prévu.