J'ai lu le code suivant mais je ne comprends pas ce que cela signifie "||" dans ce contexte:

function factorial(numero) {
  numero = numero || 1
  return numero * factorial(numero - 1)
}

Je comprends les opérateurs logiques mais je ne trouve pas le sens d'appeler la fonction si vous passez un argument. Voilà pourquoi la raison de ma question.

-4
Iván 15 avril 2018 à 01:00

5 réponses

Meilleure réponse

Cela s'appelle un court-circuit. || est l'opérateur OR, mais la façon dont il est évalué, il regardera le côté gauche (et ne regardera jamais le côté droit, donc "court-circuitant".

Si c'est vrai, il utilisera cette valeur. S'il est faux, il utilisera le côté droit. Ici, si 'numero' n'est pas défini, ce sera faux, et donc la valeur par défaut de l'espace réservé de 1 sera utilisée.

5
Dan Oswalt 14 avril 2018 à 22:03

C'est comme un repli. Si numero est une valeur falsy (false, '', undefined, null, NaN, 0 ), il définira la valeur sur 1.

Comme nous pouvons le voir ici dans ces deux tests, si aucune valeur n'est transmise, elle utilisera la solution de repli sinon elle utilisera la valeur transmise comme paramètre.

function test(value) {
  console.log(value || 'Not Set')
}

test()
test('Awesome')

Il existe également des méthodes plus avancées qui fonctionnent différemment mais produisent également un effet similaire. Ici, nous pouvons faire l'opposé complet en utilisant && à la place, qui n'exécutera l'élément suivant que si la commande précédente est truthy.

let items = []

function addItem(a) {
  let contains = items.includes(a)
  !contains && items.push(a)
}

addItem('cat')
addItem('dog')
addItem('pig')
addItem('cat')
addItem('cat')

console.log(items)

Dans ce qui précède, nous utilisons && à la place, ce qui fera exactement le contraire de ||, donc si contains est vrai, nous exécutons la commande suivante, sinon terminons l'instruction en cours.

Enfin, nous pouvons combiner les deux et obtenir un tout nouveau résultat:

let items = []

function addItem(a) {
  let contains = items.includes(a)
  !contains && a % 2 == 0 && items.push(a) || console.log('Item', a, 'is not valid')
}

addItem(1)
addItem(2)
addItem(10)
addItem(15)
addItem(10)
addItem(100)
addItem(102)
addItem(103)

console.log(items)

Et avec cet exemple, nous n'insérons des éléments dans le tableau que s'ils ne sont pas déjà dans le tableau et sont un nombre pair. sinon, nous afficherons que la valeur n'est pas un insert valide, soit parce qu'elle était déjà dans le tableau, soit qu'elle n'était pas un événement.

3
Get Off My Lawn 14 avril 2018 à 22:25

En Javascript, mais aussi dans d'autres langues, l'opérateur || est défini comme:

OU logique (||) expr1 || expr2 Renvoie expr1 s'il peut être converti en true; sinon, renvoie expr2. Ainsi, lorsqu'il est utilisé avec des valeurs booléennes, || renvoie vrai si l'un des opérandes est vrai. (https://developer.mozilla.org/it/docs / Web / JavaScript / Référence / Opérateurs / Opérateurs_logiques)

Cet extrait est un raccourci pour:

if (!numero)
    numero = 1;

Donc, si numero est une valeur falsey (0, Nan, null, indéfinie ou une chaîne vide), elle sera définie sur 1.

0
Daniele Paolini 14 avril 2018 à 22:17

Cela signifie ou cela signifie toujours ou en JavaScript. Ce que fait cette déclaration, c'est de mettre numero à la valeur actuelle de numero s'il s'agit d'une valeur véridique ou 1 si ce n'est pas le cas.

La nouvelle syntaxe vous permet de faire ceci:

function factorial(numero = 1) {
    ....
}

Ce qui est plus pratique pour définir les valeurs par défaut des paramètres.

1
Titus 14 avril 2018 à 22:12

Il ne fait que développer la deuxième branche. Si dans votre cas, le paramètre n'est pas donné, comme mentionné ci-dessus, il est appelé évaluations de court-circuit.

Traitez-le comme si Numero était passé, affectez-le à la variable ELSE, définissez la variable sur 1

0
NarrowVision 14 avril 2018 à 22:19