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 :
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.