2009-11-06 7 views
8

Que représente ce bit de code? Je sais qu'il est une sorte de syntaxe alternative if ...JavaScript si alternative

pattern.Gotoccurance.score != null ? pattern.Gotoccurance.score : '0' 

Mise à jour:

Quelle est la nécessité de ce type de codage? Est-ce plus efficace ou juste une version raccourcie avec la même efficacité?

Répondre

34

Il est l'opérateur conditional, il est équivalent à quelque chose comme ceci:

if (pattern.Gotoccurance.score != null) { 
    pattern.Gotoccurance.score; 
} else { 
    '0'; 
} 

Mais je pense qu'une déclaration d'affectation est manquante dans le code affiché, comme ceci:

var score = pattern.Gotoccurance.score !=null ? pattern.Gotoccurance.score : '0'; 

La variable score sera affectée si pattern.Gotoccurance.score n'est pas nulle:

var score; 
if (pattern.Gotoccurance.score != null) { 
    score = pattern.Gotoccurance.score; 
} else { 
    score = '0'; 
} 

Un modèle commun pour faire ce genre de missions « de valeur par défaut » en JavaScript est d'utiliser l'opérateur logique OU (||):

var score = pattern.Gotoccurance.score || '0'; 

La valeur de pattern.Gotoccurance.score sera affectée à la variable score seulement si cette valeur n'est pas falsie (les valeurs de la falsification sont false, null, undefined, 0, chaîne de longueur nulle ou NaN).

Sinon, s'il est falsifié, '0' sera affecté.

Mise à jour: La performance sera équivalent, vous devriez vous concentrer sur la lisibilité, je tente d'utiliser l'opérateur ternaire sur les expressions qui sont très simples, et vous pouvez également améliorer la mise en forme, la divisant en deux lignes pour faire plus lisible:

var status = (age >= 18) ? "adult" 
         : "minor"; 

question connexe:

+0

Oh, ok gr8, pourquoi avoir besoin de ce genre de codage, est-ce plus efficace ou juste une version raccourcie avec la même efficacité? –

+0

Le temps d'interprétation affecte-t-il les performances? – barkmadley

+0

C'est le genre de réponse qui fait la différence. Plus de doute quand il s'agit de JavaScript et de l'opérateur ternaire. Bien fait CMS. –

2

On l'appelle l'opérateur ternaire.

+3

C'est * un * opérateur ternaire. Il se trouve être le seul dans la langue, mais il pourrait y avoir d'autres opérateurs ternaires théoriques. –

5

Ceci est un ternary operator, un moyen de faire des instructions en mode court.

Si re-écrit, il ressemblerait à ceci:

if (pattern.Gotoccurance.score != null) { 
    return pattern.Gotoccurance.score; 
} else { 
    return '0'; 
} 
+0

+1 pour dire "ternaire", j'oublie toujours le nom de ce type :) – marcgg

+0

"ternaire" signifie simplement "fonction avec arité de 3." ...? ..: ... est l'opérateur conditionnel. –

0

En réponse à la mise à jour de la question: « Pourquoi le besoin de ce type de codage? »

Vous pouvez parfois utiliser l'opérateur ternaire pour réduire la complexité:

Par exemple, j'ai une page web qui avait besoin de vérifier que au moins deux des trois champs de texte spécifiques avaient des valeurs entrées.If/logique autre avait l'air assez laid, mais l'opérateur ternaire fait une seule ligne pour déterminer le nombre de champs ont été remplis:

var numberFilledInFields = ((firstName.length > 0 ? 1 : 0) + 
        (lastName.length > 0 ? 1 : 0) + 
        (zipCode.length > 0 ? 1 : 0)); 

if (numberFilledInFields < 2) 
{ 
    validation = false; 
    return; 
} 

Cette solution semble tout à fait élégante et facile à lire que certaines solutions de rechange.

0

Il s'agit d'un opérateur ternaire/opérateur conditionnel.

En mathématiques, un ternary operation est une opération n-aire avec n = 3. Une opération ternaire dans un ensemble A prend des données de trois éléments A et les combine pour former un seul élément de A.

il est une forme de main courte de if..else

par exemple voulez savoir si un nombre est encore ou non

// Utilisation de l'approche if..else

function CheckEvenOdd() 
{ 
    var number = 2; 
    if(number %2 == 0) alert("even");else alert("odd"); 
} 

// utilise ternaire

function CheckEvenOdd() 
{ 
    var number = 2; 
    alert((number %2 == 0)?"even":"odd"); 
} 

Une autre variante est passer

// en utilisant le commutateur

function CheckEvenOdd() 
{ 
    var number = 2; 
    switch(number %2) 
    { 
     case 0:alert("even");break; 
     default:alert("odd");break; 
    } 
} 

Maintenant, si vous avez une simple condition if..else à effectuer comme celle décrite, vous pouvez aller de l'avant avec ternary.

Mais si la vérification conditionnelle devient complexe, aller soit avec if..else ou interrupteur lisibilité sera perdue dans ternaire

par exemple il est facile d'effectuer un minimum ou un maximum de deux nombres en utilisant un opérateur ternaire, mais devient maladroit pour trouver le plus grand & deuxième plus grand parmi 3 nombres ou plus et n'est même pas recommandé. Il vaut mieux utiliser if..else à la place

Questions connexes