Muy bien, así que estaba jugando con parseInt para ver cómo maneja los valores aún no inicializados y me topé con esta gema. Lo siguiente sucede para cualquier raíz 24 o superior.
parseInt(null, 24) === 23 // evaluates to true
Lo probé en IE, Chrome y Firefox y todos alertan de verdad, así que creo que debe estar en alguna parte de la especificación. Una búsqueda rápida en Google no me dio ningún resultado, así que aquí estoy, esperando que alguien pueda explicarlo.
Recuerdo haber escuchado un discurso de Crockford en el que estaba diciendo typeof null === "object"
debido a un descuido que hizo que Object y Null tuvieran un identificador de tipo casi idéntico en la memoria o algo por el estilo, pero ahora no puedo encontrar ese video.
Pruébalo: http://jsfiddle.net/robert/txjwP/
Editar corrección: una raíz más alta devuelve resultados diferentes, 32 devuelve 785077
Edición 2 de zzzzBov:[24...30]:23, 31:714695, 32:785077, 33:859935, 34:939407, 35:1023631, 36:1112745
tl; dr
Explica por qué parseInt(null, 24) === 23
es una declaración verdadera.
fuente
alert(parseInt(null, 34) === 23)
producidofalse
alert(parseInt(null,26)===23);
también produce verdadero?!?![24...30]:23
,31:714695
,32:785077
,33:859935
,34:939407
,35:1023631
,36:1112745
,[37...]:NaN
undefined
como el primer parámetro devuelve resultados impares para los años 30Respuestas:
Se está convirtiendo
null
a la cadena"null"
e intentando convertirla. Para radixes del 0 al 23, no hay números que pueda convertir, por lo que devuelveNaN
. A los 24,"n"
se agrega la 14a letra al sistema de numeración. A los 31,"u"
se agrega la letra 21 y se puede decodificar toda la cadena. A los 37 años ya no hay ningún conjunto de números válido que pueda generarse y se devuelve NaN.fuente
toString()
?Mozilla nos dice :
En la especificación , 15.1.2.2/1 nos dice que la conversión a cadena se realiza utilizando el incorporado
ToString
, que (según 9.8) produce"null"
(no debe confundirse contoString
, ¡lo que produciría"[object Window]"
!).Entonces, consideremos
parseInt("null", 24)
.Por supuesto, esta no es una cadena numérica de base 24 en su totalidad, pero "n" es: es 23 decimal .
Ahora, el análisis se detiene después de extraer el decimal 23, porque
"u"
no se encuentra en el sistema base-24:(Y esta es la razón por la cual
parseInt(null, 23)
(y los radios más bajos) le da enNaN
lugar de 23:"n"
no está en el sistema de base 23).fuente
Ignacio Vazquez-Abrams es correcto, pero veamos exactamente cómo funciona ...
De
15.1.2.2 parseInt (string , radix)
:Hay dos partes importantes aquí. Los en negrita los dos. Entonces, antes que nada, tenemos que descubrir cuál es la
toString
representación denull
. Necesitamos mirarTable 13 — ToString Conversions
en la sección 9.8.0 para esa información:Genial, así que ahora sabemos que hacer
toString(null)
internamente produce una'null'
cadena. Genial, pero ¿cómo maneja exactamente los dígitos (caracteres) que no son válidos dentro de la raíz proporcionada?Miramos arriba
15.1.2.2
y vemos la siguiente observación:Eso significa que manejamos todos los dígitos ANTES de la raíz especificada e ignoramos todo lo demás.
Básicamente, hacer
parseInt(null, 23)
es lo mismo queparseInt('null', 23)
. Estou
hace que los dosl
se ignoren (a pesar de que SON parte de la raíz 23). Por lo tanto, solo podemos analizarn
, haciendo que toda la declaración sea sinónimo deparseInt('n', 23)
. :)De cualquier manera, ¡gran pregunta!
fuente
Es equivalente a
que es equivalente a
Los dígitos para la base 24 son 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, ..., n.
La especificación del idioma dice
que es la parte que garantiza que los literales enteros de estilo C como
15L
analizar correctamente, por lo que lo anterior es equivalente a"n"
es la letra 23 de la lista de dígitos anterior.QED
fuente
Supongo que
null
se convierte en una cadena"null"
. Entonces, enn
realidad está23
en 'base24' (lo mismo en 'base25' +),u
no es válido en 'base24', pornull
lo que se ignorará el resto de la cadena . Es por eso que sale23
hastau
que sea válido en 'base31'.fuente
parseInt usa representación alfanumérica, luego en base-24 "n" es válido, pero "u" es un carácter no válido, luego parseInt solo analiza el valor "n" ...
como ejemplo, prueba con esto:
El resultado será "3".
fuente