Utilisation correcte de ||

La question générale que je suppose est: quand? || Retournez l'élément sur la gauche, et quand retournez-vous l'élément sur la droite?

La question spécifique est pourquoi cela ne fonctionne pas:

var fibonacci = (function () { var cache = [0, 1]; function fibonacci(number) { return cache[number] = cache[number] || (fibnonacci(number - 1) + fibonacci(number - 2)); } return fibonacci; })(); var $div = $('div'); for (var index = 0; index < 10; index++) { $('<span />').text(fibonacci(index)) .appendTo($div); } 

Il renvoie l'élément sur la gauche si et seulement si c'est vrai.

Ce qui suit n'est pas vrai:

  • La valeur booléenne primitive false
  • La valeur de chaîne primitive "" (la chaîne vide)
  • Les chiffres +0, -0 et NaN
  • La valeur primitive null
  • La valeur primitive undefined

Tout le reste est vrai.

Voici la liste des spécifications linguistiques .

Dans votre cas, le cache[0] renvoie 0, ce qui, comme on peut le voir, est faux, il entre dans la récurrence. C'est pourquoi nous évitons || Pour les courts-circuits dans ces situations.

Vous devriez envisager de vérifier directement que l'objet a cette propriété: le number in cache est une de telle manière et l'autre est le cache[number] !== undefined .

Votre code ne fonctionne pas car vous ne pouvez pas utiliser la valeur dans le cache lorsqu'il est 0 comme 0 || func() 0 || func() demande la fonction à appeler.

Donc, il appelle toujours le deuxième terme pour 0 et crée donc un débordement de pile car la récursion n'a pas de fin.

Une solution serait de modifier votre fonction interne comme ceci:

 function fibnonacci(number) { if (number in cache) return cache[number]; return cache[number] = fibnonacci(number - 1) + fibonacci(number - 2); } 

En guise d'attention, notez l'orthographe de Fibonacci .

Il renvoie le premier true de la gauche. S'il n'y a pas de true il renvoie false . Si les expressions résolvent à vrai, dans le cas d'une valeur booléenne ou non nulle ou non nulle ou non définie.

Modifier:

Oui, la valeur doit être vrai … non seulement vrai.