Très bien, donc je plaisantais avec parseInt pour voir comment il gère les valeurs non encore initialisées et je suis tombé sur ce joyau. Ce qui suit se produit pour tout radix 24 ou supérieur.
parseInt(null, 24) === 23 // evaluates to true
Je l'ai testé dans IE, Chrome et Firefox et ils alertent tous vrai, donc je pense que cela doit être quelque part dans les spécifications. Une recherche rapide sur Google ne m'a donné aucun résultat alors me voici, en espérant que quelqu'un puisse m'expliquer.
Je me souviens avoir écouté un discours de Crockford où il disait à typeof null === "object"
cause d'une erreur qui faisait que Object et Null avaient un identifiant de type presque identique en mémoire ou quelque chose du genre, mais je ne trouve pas cette vidéo maintenant.
Essayez-le: http://jsfiddle.net/robert/txjwP/
Correction d' édition : un radix plus élevé renvoie des résultats différents, 32 renvoie 785077
Edit 2 De zzzzBov:[24...30]:23, 31:714695, 32:785077, 33:859935, 34:939407, 35:1023631, 36:1112745
tl; dr
Expliquez pourquoi parseInt(null, 24) === 23
est une vraie déclaration.
la source
alert(parseInt(null, 34) === 23)
produitfalse
alert(parseInt(null,26)===23);
produit également vrai?!?![24...30]:23
,31:714695
,32:785077
,33:859935
,34:939407
,35:1023631
,36:1112745
,[37...]:NaN
undefined
car le premier paramètre renvoie des résultats étranges pour les années 30Réponses:
Il s'agit de convertir
null
en chaîne"null"
et d'essayer de le convertir. Pour les radix 0 à 23, il n'y a aucun chiffre qu'il peut convertir, il revient doncNaN
. À 24 ans,"n"
la 14e lettre est ajoutée au système numérique. Au 31,"u"
la 21e lettre est ajoutée et la chaîne entière peut être décodée. À 37, il n'y a plus de jeu de chiffres valide pouvant être généré et NaN est retourné.la source
toString()
?Mozilla nous dit :
Dans la spécification , 15.1.2.2/1 nous dit que la conversion en chaîne est effectuée en utilisant le intégré
ToString
, qui (selon 9.8) donne"null"
(à ne pas confondre avectoString
, ce qui donnerait"[object Window]"
!).Alors, réfléchissons
parseInt("null", 24)
.Bien sûr, ce n'est pas une chaîne numérique de base 24 dans son intégralité, mais "n" est: c'est décimal 23 .
Maintenant, l'analyse s'arrête une fois la décimale 23 retirée, car elle
"u"
n'est pas trouvée dans le système en base 24:(Et c'est pourquoi
parseInt(null, 23)
(et les radices inférieurs) vous donneNaN
plutôt que 23:"n"
n'est pas dans le système base-23.)la source
Ignacio Vazquez-Abrams est correct, mais permet de voir exactement comment cela fonctionne ...
De
15.1.2.2 parseInt (string , radix)
:Il y a deux parties importantes ici. Je les ai mis en gras tous les deux. Donc, tout d'abord, nous devons découvrir quelle est la
toString
représentation denull
. Nous devons regarderTable 13 — ToString Conversions
dans la section 9.8.0 pour cette information:Génial, alors maintenant nous savons que faire en
toString(null)
interne produit une'null'
chaîne. Très bien, mais comment gère-t-il exactement les chiffres (caractères) qui ne sont pas valides dans le radix fourni?Nous regardons ci-dessus
15.1.2.2
et nous voyons la remarque suivante:Cela signifie que nous traitons tous les chiffres AVANT le radix spécifié et ignorons tout le reste.
Fondamentalement, faire
parseInt(null, 23)
est la même chose queparseInt('null', 23)
. Leu
fait que les deuxl
soient ignorés (même s'ils font partie de la radix 23). Par conséquent, nous ne pouvons analyser quen
, ce qui rend la déclaration entière synonyme deparseInt('n', 23)
. :)De toute façon, bonne question!
la source
Est équivalent à
ce qui équivaut à
Les chiffres de la base 24 sont 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, ..., n.
La spécification de langue dit
qui est la partie qui garantit que les littéraux entiers de style C aiment
15L
bien analyser, donc ce qui précède est équivalent à"n"
est la 23 e lettre de la liste de chiffres ci-dessus.QED
la source
Je suppose qu'il
null
est converti en chaîne"null"
. Donc,n
est en fait23
dans «base24» (même dans «base25» +),u
n'est pas valide dans «base24», donc le reste de la chaînenull
sera ignoré. C'est pourquoi il sort23
jusqu'à ceu
qu'il devienne valide dans 'base31'.la source
parseInt utilise une représentation alphanumérique, puis en base-24 "n" est valide, mais "u" est un caractère invalide, puis parseInt analyse uniquement la valeur "n" ....
à titre d'exemple, essayez avec ceci:
Le résultat sera "3".
la source