¿Alguien sabe cómo puedo verificar si una variable es un número o una cadena en JavaScript?
javascript
types
Jin Yong
fuente
fuente
Respuestas:
Si se trata de notación literal y no de constructores, puede usar typeof :.
Si está creando números y cadenas a través de un constructor, como
var foo = new String("foo")
, debe tener en cuenta quetypeof
puede volverobject
parafoo
.Quizás un método más infalible para verificar el tipo sería utilizar el método encontrado en underscore.js (se puede encontrar la fuente anotada aquí ),
Esto devuelve un valor booleano
true
para lo siguiente:fuente
var myString = new String("stuff I like"); isString(myString)
esto devuelve falso. Además, no estoy exactamente seguro de cuánto tiempo dura la conversión de backgroiund, sé que cuando llamo "hola" .length, "hola" se convierte en un objeto, no estoy seguro de qué tan pronto se vuelve a convertir o si alguna vez se vincula a la variableLa mejor manera de hacerlo es usar el
isNaN
tipo + casting:Método todo actualizado:
Lo mismo usando regex:
fuente
null
es forzado a 0 y vuelve verdadero paraisNumber(null);
function is_number(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n);}
La mejor manera que he encontrado es buscar un método en la cadena, es decir:
o si desea hacer algo con la verificación de número para una propiedad de número,
Esto es algo así como "escribir pato", depende de usted qué sentido tiene más sentido. No tengo suficiente karma para comentar, pero typeof falla para cadenas y números en caja, es decir:
alertará "objeto".
fuente
typeof
ya que siempre puede probar una cadena, ya sea primitiva u objeto de cadena. Solo tiene que probar un método que sea único para el tipo que desee.{substring:"hello"}
. Sé que, para mis propósitos, acabo de probar lo que la operación específica que necesitaba hacer (módulo) hace para el tipo que necesitaba verificar (en las cadenas, el módulo devuelve indefinido) y luego verifiqué eso en lugar de obtener su tipo.Estas buscando
isNaN()
:Vea la función JavaScript isNaN () en MDN.
fuente
isNaN
devuelvefalse
paranull
(perotrue
paraundefined
).Compruebe si el valor es un literal de cadena o un objeto de cadena:
Prueba de unidad:
Verificar un número es similar:
fuente
function is (type, value) { return value["constructor"] === type; }
?Desde ES2015, la forma correcta de verificar si una variable contiene un número válido es
Number.isFinite(value)
Ejemplos:
fuente
Prueba esto,
fuente
La mejor manera de hacer esto:
Esto satisface los siguientes casos de prueba:
fuente
O adáptelo para devolver un tipo desconocido:
Actualización del 12 de mayo de 2012: ejemplo completo en Javascript: un tipo mejor .
fuente
realTypeOf
:realTypeOf(NaN) -> "Number"
cuál es el mismo comportamientotypeof
acordado pero aún lejos de ser ideal.Aquí hay un enfoque basado en la idea de coaccionar la entrada a un número o cadena agregando cero o la cadena nula, y luego hacer una comparación de igualdad escrita.
Por alguna razón insondable,
x===x+0
parece funcionar mejor quex===+x
.¿Hay algún caso donde esto falla?
En la misma vena:
Esto parece ser ligeramente más rápido que cualquiera
x===true || x===false
otypeof x==="boolean"
(y mucho más rápido quex===Boolean(x)
).Entonces también hay
Todo esto depende de la existencia de una operación de "identidad" particular para cada tipo que puede aplicarse a cualquier valor y producir de manera confiable un valor del tipo en cuestión. No puedo pensar en tal operación para fechas.
Para NaN, hay
Esta es básicamente la versión de subrayado, y tal como está es aproximadamente cuatro veces más rápido que
isNaN()
, pero los comentarios en la fuente de subrayado mencionan que "NaN es el único número que no es igual a sí mismo" y agrega un cheque para _.isNumber. ¿Por qué? ¿Qué otros objetos no serían iguales? Además, el subrayado utiliza,x !== +x
pero ¿qué diferencia podría tener el+
hacer aquí?Entonces para los paranoicos:
o esto
fuente
¿Puedes dividirlo por 1?
Supongo que el problema sería una entrada de cadena como: "123ABG"
Justo como lo hice recientemente.
fuente
eh, ¿qué tal solo:
Después de una revisión adicional muchos meses después, esto solo garantiza que
obj
es un objeto que tiene el método o nombre de propiedadtoLowerCase
definido. Estoy avergonzado de mi respuesta. Por favor veatypeof
uno de los más votados .fuente
O simplemente use la inversión de
isNaN()
:Y sí, usar jQuery's
$.isNumeric()
es más divertido.fuente
isNaN('123')
da falso, aunque el argumento es una cadena numérica y no un tipo numéricoCreo que la conversión de var a una cadena disminuye el rendimiento, al menos esta prueba realizada en los últimos navegadores así lo demuestra.
Así que si te importa el rendimiento, lo usaría
para verificar si la variable es una cadena (incluso si la usa
var str = new String("foo")
,str instanceof String
devolvería verdadero).En cuanto a verificar si es un número, iría por el nativo
isNaN
:; función.fuente
jQuery usa esto:
fuente
¡Esta solución resuelve muchos de los problemas planteados aquí!
Este es, con mucho, el método más confiable que he usado hasta ahora. No inventé esto, y no puedo recordar dónde lo encontré originalmente. Pero funciona donde otras técnicas fallan:
Ejemplo de corrección
fuente
typeof
método nativo (0.788s frente a 1.481s) en Chrome. Esto ciertamente es un rendimiento aceptable considerando los mejores resultados. ¿Por qué crees que es "realmente lento"? Tal vez es - en IE6 / 7/8? Pero todo es "realmente lento" en esos navegadores.typeof
es 100 veces más rápido, ¿qué me estoy perdiendo?Solo para tu información, si estás usando jQuery tienes
para manejar esto. Más detalles en http://api.jquery.com/jQuery.isNumeric/
fuente
typeof me funciona muy bien en la mayoría de los casos. Puedes intentar usar una declaración if
donde x es cualquier nombre de variable de su elección
fuente
La mejor manera que encontré que también piensa en números positivos y negativos es de: O'Reilly Javascript y DHTML Cookbook :
}
fuente
Errr? ¡Solo usa expresiones regulares! :)
fuente
dado que una cadena como '1234' con typeof mostrará 'cadena', y lo inverso nunca puede suceder (typeof 123 siempre será número), lo mejor es usar una expresión regular simple
/^\-?\d+$/.test(var)
. O un más avanzado para unir flotantes, enteros y números negativos./^[\-\+]?[\d]+\.?(\d+)?$/
El lado importante de esto.test
es que NO arrojará una excepción si el var no es una cadena, el valor puede ser cualquier cosa.Si está buscando el tipo real, entonces typeof solo servirá.
fuente
La respuesta de @ BitOfUniverse es buena, y se me ocurre una nueva forma:
Sé
0
que no puede ser dividendo, pero aquí la función funciona perfectamente.fuente
Comprobación de tipo
Puede verificar el tipo de variable utilizando el
typeof
operador:Comprobación de valor
El siguiente código devuelve verdadero para los números y falso para cualquier otra cosa:
fuente
typeof
operador! @JustAMartinnumber
pero si paso '123' o 'abc' o cualquier otro literal citado, es una cadena, y no importa si se puede analizar en un número o no.La operación XOR se puede utilizar para detectar números o cadenas. número ^ 0 siempre dará el número como salida y la cadena ^ 0 dará 0 como salida.
fuente
Simple y minucioso:
Casos de prueba:
fuente
Simplemente use
o
si desea manejar cadenas definidas como objetos o literales y guardados, no desea utilizar una función auxiliar.
fuente
fuente
Muy tarde a la fiesta; sin embargo, lo siguiente siempre me ha funcionado bien cuando quiero verificar si alguna entrada es una cadena o un número de una sola vez.
fuente
Creó un jsperf en la comprobación de si una variable es un número. ¡Bastante interesante! typeof en realidad tiene un uso de rendimiento. Utilizando
typeof
para cualquier otra cosa que no sean números, generalmente va un tercio de la velocidad como unvariable.constructor
ya que la mayoría de los tipos de datos en JavaScript son Objetos; los números no son!http://jsperf.com/jemiloii-fastest-method-to-check-if-type-is-a-number
typeof variable === 'number'
El | más rápido | si desea un número, como 5, y no '5'typeof parseFloat(variable) === 'number'
| más rápido | si desea un número, como 5 y '5'isNaN()
es más lento, pero no mucho más lento. Tenía grandes esperanzasparseInt
yparseFloat
, sin embargo, eran terriblemente más lentas.fuente
Para detectar números, el siguiente pasaje de JavaScript: The Good Parts de Douglas Crockford es relevante:
fuente