J'ai une série de calculs Javascript qui (uniquement sous IE) montrent Infinity en fonction des choix de l'utilisateur.
Comment empêcher le mot d' Infinity
apparaître et, par exemple, montrer à la 0.0
place?
javascript
infinity
Homer_J
la source
la source
Number.(POSITIVE|NEGATIVE)_INFINITY
place de-?Infinity
ou-?1/0
?Infinity
propriété globale n'est pas en lecture seule, ce qui signifie qu'elle peut être redéfinie: par exemple,var x = 42; Infinity = 42; alert(x === Infinity);
affiche "true" . (Certes, c'est un cas obscur, et quiconque décide de redéfinirInfinity
,NaN
etc. devrait s'attendre à ce que des choses étranges se produisent.)Number.(POSITIVE|NEGATIVE)_INFINITY
n'est pas non plus en lecture seule,Infinity
est en lecture seule en mode strict. Et qu'en est-il du-?1/0
cas que je vous ai présenté? Quoi qu'il en soit, vous devriez presque toujours utiliser à laisFinite
place.Number.POSITIVE_INFINITY
etNumber.NEGATIVE_INFINITY
sont en lecture seule (testés sur Chrome8, FF3.6 et IE8). L'utilisation1/0
fonctionne bien, mais ce ne sera pas si évident pour les responsables de votre code ce que vous essayez réellement de tester. Je conviens que l'utilisationisFinite
est presque toujours la meilleure façon de faire les choses - c'est pourquoi je l'ai mentionné dans ma réponse - mais seul le PO peut décider si cela répond à leurs exigences.Object.defineProperty
et__defineGetter__
.Infinity
, d'autre part, n'est pas configurable en mode strict.Un simple
n === n+1
oun === n/0
fonctionne:Sachez que le natif
isFinite()
contraint les entrées aux nombres.isFinite([])
etisFinite(null)
sont les deuxtrue
par exemple.la source
n === n+1
vaut vrai pour tous les nombres supérieurs à 2 ^ 53, c'est-à-dire 1e30. Le hack de division fonctionne, même pour NaN et -Infinity. Cependant, la réponse de LukeH vous donne un code plus lisible.n+1
ne peuvent donc pas être représentés et sont sujets à des arrondis. Eh bien, même les entiers sont affectés par les erreurs d'arrondi. Btw, je ne pense pas que votre code soit "math-proof", essayez justen === n/-0
. Lorsque vous complétez les réels avec +/- inf, votre limite n'est pas bien définie à moins que la séquence zéro sous-jacente ne soit supposée positive.In
ES6
, LaNumber.isFinite()
méthode détermine si la valeur transmise est un nombre fini.la source
En fait, n === n + 1 fonctionnera pour les nombres supérieurs à 51 bits, par exemple
la source
J'aime utiliser Lodash pour diverses raisons de codage défensif ainsi que pour la lisibilité. ES6
Number.isFinite
est génial et n'a pas de problèmes avec les valeurs non numériques, mais si ES6 n'est pas possible, vous avez déjà lodash ou voulez un code plus court : _.isFinitela source
J'ai rencontré un scénario qui m'obligeait à vérifier si la valeur est du type
NaN
ouInfinity
mais à passer des chaînes comme résultats valides. Étant donné que de nombreuses chaînes de texte produiront des faux positifsNaN
, j'ai proposé une solution simple pour contourner cela:Le code ci-dessus convertit les valeurs en chaînes et vérifie si elles sont strictement égales à NaN ou Infinity (vous devrez ajouter un autre cas pour l'infini négatif).
Alors:
la source
NaN
s, etc.toString()
place? N'hésitez pas à voter contre ou à indiquer les raisons pour lesquelles cela pourrait donner des résultats incohérents ou pourquoi exactement cette méthode n'est pas recommandée. Jusqu'à présent, je pense toujours que cela ajoute une option pour quiconque cherche une réponse et il n'y a pas de raisons concrètes pour lesquelles c'est dangereux, instable, etc.Vous pouvez utiliser isFinite dans la fenêtre,
isFinite(123)
:Vous pouvez écrire une fonction comme:
Et utilisez comme:
Vous pouvez également
Number.isFinit
vérifier si la valeur est également Number et est plus précise pour la vérificationundefined
,null
etc.Ou vous pouvez le polyfill comme ceci:
la source