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:
false
""
(la chaîne vide) NaN
null
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.
Oui, la valeur doit être vrai … non seulement vrai.