28 votes

Pourquoi `isFinite (null) === true`?

Voici des exemples qui ont du sens pour moi.

 isFinite(5) // true - makes sense to me, it is a number and it is finite
  typeof 5 // "number"
isFinite(Infinity) // false - makes sense for logical reasons
  typeof Infinity // "number"
isFinite(document) // false - makes sense as well, it's not even a number
  typeof document // "object"
 

Ce qui suit est où je suis confus.

 isFinite(null) // true - Wait what? Other non-number objects returned false. I see no reason?
  typeof null // "object"
 

Je ne vois tout simplement pas le raisonnement derrière cela. Ce que j'aimerais, c'est la réponse la plus faible possible. Je pense que null est converti en 0, pourquoi? Quels autres impacts cela at-il?

43voto

SomeKittens Points 13274

L'ECMAScript spec (5.1) définit isFinite à agir de la sorte:

isFinite (nombre)

Retourne false si l'argument contraint à NaN, + ∞ ou −∞, et sinon renvoie la valeur true.

Si ToNumber(nombre) est NaN, + ∞ ou −∞, retourne false.

Sinon, retourner la valeur true.

En d'autres termes, isFinite appelle ToNumber sur tout ce qui est passé en, et de comparer ensuite soit pos/nég l'infini ou NaN.

En JavaScript (notez l'utilisation de l' != , au lieu de les plus courantes !==, provoquant le type de fonte):

function isFinite(someInput) {
  return !isNaN(someInput) &&
    someInput != Number.POSITIVE_INFINITY &&
    someInput != Number.NEGATIVE_INFINITY;
}

(Comme indiqué dans les commentaires ci-dessous, someInput != NaN n'est pas nécessaire, comme NaN est défini de manière à ne pas être équivalent à tout, y compris lui-même).

Maintenant, pourquoi est - null converti à zéro (par opposition à l' undefined)? Comme TylerH dit dans les commentaires, null signifie qu'une valeur existe, mais est vide. La représentation mathématique de ce est de 0. undefined signifie qu'il n'y a pas de valeur, alors nous obtenons NaN lorsque vous essayez d'appeler ToNumber sur il.

http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.2.5

Cependant, ECMAScript 6 est d'apporter le long d'un non-conversion isFinite comme une propriété de l' Number. Douglas Crockford proposé ici: http://wiki.ecmascript.org/doku.php?id=harmony:number.isfinite

12voto

brbcoding Points 5024

De MDN:

Le mondial isFinite() fonction détermine si la valeur passée est un nombre fini. Si nécessaire, le paramètre est d'abord converti en un numéro.

Donc, il est converti en un nombre...

isFinite(null)
isFinite(+null) //convert to a number
isFinite(0) // true because +null or Number(null) = 0

La spécification dit que le global isFinite() méthode de force convertir le paramètre nombre.

Vous pouvez, cependant, utiliser (à vos risques et périls) EcmaScript 6 spec Number.isFinite() ce qui ne veut pas effectuer cette conversion.

Number.isFinite(null) // false

Ou, comme lodash et de souligner le faire...

var _.isFinite = function(obj) {
  return isFinite(obj) && !isNaN(parseFloat(obj));
};

11voto

Bergi Points 104242

isFinite appelle ToNumber sur son argument. Donc

 > Number(null)
0
> Number(document)
NaN
> isFinite(0)
true
> isFinite(NaN)
false

> isFinite(null)
true
> isFinite(document)
false
 

6voto

Rahul Points 17363

Parce que si tu dis

Number(null) === 0 qui est fini

Voir les conversions de nombres

Ce qui signifie que, pour le type d'argument null résultat est +0

4voto

sabof Points 4628

isFinite transcrit son argument en un nombre, s'il ne l'est pas déjà. Essentiellement, vous avez isFinite(Number(null)) et Number(null) === 0 . Ce qui est fini.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X