Puedes usar el typeof
operador:
var booleanValue = true;
var numericalValue = 354;
var stringValue = "This is a String";
var stringObject = new String( "This is a String Object" );
alert(typeof booleanValue) // displays "boolean"
alert(typeof numericalValue) // displays "number"
alert(typeof stringValue) // displays "string"
alert(typeof stringObject) // displays "object"
Ejemplo de esta página web . (Sin embargo, el ejemplo fue ligeramente modificado).
Esto no funcionará como se espera en el caso de las cadenas creadas con new String()
, pero esto rara vez se usa y se recomienda contra [1] [2] . Vea las otras respuestas sobre cómo manejarlas, si así lo desea.
- La Guía de estilo de JavaScript de Google dice que nunca use envoltorios de objetos primitivos .
- Douglas Crockford recomendó que los envoltorios de objetos primitivos sean obsoletos .
new String('foo')
, pero eso no importa porque las cadenas envueltas en objetos son una característica inútil que no debería usar. La guía de estilo de Google los prohíbe , Douglas Crockford quiere que sean desaprobados , y ninguna biblioteca los usa. Finge que no existen y úsalotypeof
sin miedo.typeof
se desaprobara también?Esto es lo que funciona para mí:
fuente
instanceof
comprobación aquí es ruido sin sentido a menos que esté siguiendo algunas prácticas de codificación muy inusuales , y esta respuesta no hace nada para explicar lo que hace o por qué podría usarlo. La única razón por la que lo necesitaría es si usa cadenas envueltas en objetos, pero las cadenas envueltas en objetos son una característica inútil que nadie usa y Google y Crockford condenan como una mala práctica ( google-styleguide.googlecode.com/svn/ trunk / ... , crockford.com/javascript/recommend.html ).typeof
yinstanceof
parece un buen consejo si su código puede ser llamado por otros '. Elpostmessage
caso marginal de @ MarkAmery importa si preguntas "¿qué era lo que acabo de decirpostmessage
?" - pero esperaría que se maneje en la interfaz y no se permita su propagación. En otros lugares, parece correcto manejar métodos de codificación no obsoletos, incluso si algunos estéticos de JS los desaprueban. ¡NUNCA comente su código como aceptando String, a menos que realmente lo haga!Dado que más de 580 personas votaron por una respuesta incorrecta, y más de 800 votaron por una respuesta funcional pero de estilo escopeta, pensé que valdría la pena rehacer mi respuesta en una forma más simple que todos puedan entender.
O en línea (tengo una configuración de UltiSnip para esto):
Para su información, la respuesta de Pablo Santa Cruz es incorrecta, porque
typeof new String("string")
esobject
La respuesta de DRAX es precisa y funcional, y debería ser la respuesta correcta (ya que Pablo Santa Cruz es definitivamente incorrecto, y no discutiré en contra del voto popular).
Sin embargo, esta respuesta también es definitivamente correcta, y en realidad es la mejor respuesta (excepto, tal vez, por la sugerencia de usar lodash / subrayado ).descargo de responsabilidad: contribuí a la base de código lodash 4.
Mi respuesta original (que obviamente voló sobre muchas cabezas) es la siguiente:
Transcodifiqué esto de underscore.js:
Eso definirá isString, isNumber, etc.
En Node.js, esto se puede implementar como un módulo:
[editar]:
Object.prototype.toString.call(x)
funciona para delinear entre funciones y funciones asíncronas también:fuente
global || window
lugar de,window
pero sería un mal enfoque para resolver un problema que no debería tener en primer lugar).myObject+"" === myObject
para verificar si un objeto es una cadena (o mejor aún, no escribiría check en un sistema de tipo basado en el comportamiento en primer lugar).toString
en elObject.prototype
. Entonces, argumentaría que confiar entoString
verificar el tipo de un objeto es, en el mejor de los casos, una mala práctica.Recomiendo usar las funciones integradas de jQuery o lodash / Underscore . Son más simples de usar y más fáciles de leer.
Cualquiera de las funciones manejará el caso mencionado por DRAX ... es decir, ambos verifican si (A) la variable es un literal de cadena o (B) es una instancia del objeto String. En cualquier caso, estas funciones identifican correctamente el valor como una cadena.
lodash / Underscore.js
jQuery
Consulte la documentación de lodash para _.isString () para obtener más detalles.
Ver documentación de jQuery para $ .type () para obtener más detalles.
fuente
_.every()
es un poco confuso de usar al principio, y algo tan simple como_.isBoolean()
ha confundido a los desarrolladores de mi empresa. Un desarrollador erróneamente pensó que sería falso si el valor era booleano y era falso. El inglés es más fácil de leer que el alemán para mí, porque no sé alemán. Aprenda JavaScript y todo tendrá sentido.Vi eso aquí:
http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/
fuente
Object.prototype.toString.call(obj) === '[object String]'
?(x === y)
tiene mejor legibilidad quex === y
?Mejor manera:
Cada uno de estos ha sido construido por su función de clase apropiada, como "new Object ()", etc.
Además, Duck-Typing: "Si parece un pato, camina como un pato y huele a pato, debe ser una matriz", lo que significa que compruebe sus propiedades.
Espero que esto ayude.
Editar; 12/05/2016
Recuerde, siempre puede usar combinaciones de enfoques también. Aquí hay un ejemplo del uso de un mapa en línea de acciones con typeof :
Aquí hay un ejemplo más 'real' del uso de mapas en línea:
Esta función usaría "conversión de tipo" [personalizada] - en lugar de "tipo - / - mapeo de valores" - para determinar si una variable realmente "existe". ¡Ahora puedes dividir ese cabello desagradable entre
null
&0
!Muchas veces ni siquiera te importa su tipo . Otra forma de evitar el tipeo es combinar conjuntos de tipo pato:
Ambos
Number.prototype
yString.prototype
tienen un.toString() method
. Simplemente se aseguró de que el equivalente de cadena del número fuera el mismo, y luego se aseguró de pasarlo a lahttp
función como aNumber
. En otras palabras, ni siquiera nos importaba cuál era su tipo.Espero que te dé más para trabajar :)
fuente
(o.constructor === Number || s.constructor === Boolean)
). Anecdóticamente,parseInt
yNaN
son herramientas frágiles pero poderosas. Solo recuerde que Not-a-Number NO es Not-a-Number y se puede definir indefinido.if(thing.call) { 'its a function'; }
oif(thing.defineProperties) { 'its an object'; }
. Gracias por el aporte, axkibe!Honestamente, no puedo ver por qué uno no usaría simplemente
typeof
en este caso:Sí, fallará contra las cadenas envueltas en objetos (por ejemplo
new String('foo')
), pero estas son ampliamente consideradas como una mala práctica y es probable que la mayoría de las herramientas de desarrollo modernas desalienten su uso. (Si ves uno, ¡solo arréglalo!)los
Object.prototype.toString
truco es algo que todos los desarrolladores front-end han sido declarados culpables de hacer un día en sus carreras, pero no dejes que te engañe por su pulido de inteligencia: se romperá tan pronto como algo parchee el prototipo de Object:fuente
Me gusta usar esta solución simple:
fuente
undefined
ynull
, y aún así obtener la respuesta correcta para cadenas vacías (ambos''
ynew String('')
).(mystring || false) && mystring.constructor === String
. Usé falso en caso de que se use en una función que debe devolver un valor booleano.Este es un gran ejemplo de por qué el rendimiento es importante:
Hacer algo tan simple como una prueba para una cadena puede ser costoso si no se hace correctamente.
Por ejemplo, si quisiera escribir una función para probar si algo es una cadena, podría hacerlo de dos maneras:
1)
const isString = str => (Object.prototype.toString.call(str) === '[object String]');
2)
const isString = str => ((typeof str === 'string') || (str instanceof String));
Ambos son bastante sencillos, entonces, ¿qué podría afectar el rendimiento? En términos generales, las llamadas a funciones pueden ser costosas, especialmente si no sabe lo que sucede dentro. En el primer ejemplo, hay una llamada de función al método toString de Object. En el segundo ejemplo, no hay llamadas a funciones, ya que typeof e instanceof son operadores. Los operadores son significativamente más rápidos que las llamadas a funciones.
Cuando se prueba el rendimiento, el ejemplo 1 es un 79% más lento que el ejemplo 2.
Ver las pruebas: https://jsperf.com/isstringtype
fuente
typeof str === 'string' || str instanceof String
(puede quitar el paréntesis que prefiero en losif (..)
casos); de todos modos, verificar tanto los tipos primitivos como los de objeto en el n. ° 2 es claro y suficiente. Estas comprobaciones deberían ser "raras" de todos modos.Funciona tanto para literales de cadena
let s = 'blah'
como para cadenas de objetolet s = new String('blah')
fuente
Tomado de lodash:
fuente
Creo que la solución @customcommander debería ser suficiente en el 90% de sus casos:
Debería servirle bien (simplemente porque normalmente no hay razón para tener
new String('something')
en su código).Si estás interesado en manejar el
String
objeto (por ejemplo, espera algunas variaciones de un tercero), usar lodash como sugiere @ ClearCloud8 parece una solución clara, simple y elegante.Sin embargo, sugeriría ser cauteloso con las bibliotecas como lodash debido a su tamaño. En lugar de hacer
Lo que trae todo el enorme objeto lodash, sugeriría algo como:
Y con un paquete simple debería estar bien (me refiero aquí al código del cliente).
fuente
Si trabaja en el entorno node.js, simplemente puede usar la función integrada isString en utils.
Editar: como mencionó @Jehy, esto está en desuso desde v4.
fuente
typeof value === 'string'
lugar".x = new String('x'); x.isString(x);
devuelve falso . Hayutil.types.isStringObject()
pero eso devuelve falso para elx = 'x'
tipo cadena. Dos funciones de utilidad que no proporcionan absolutamente ninguna utilidad ...El siguiente método verificará si alguna variable es una cadena ( incluidas las variables que no existen ).
fuente
También descubrí que esto también funciona bien, y es mucho más corto que los otros ejemplos.
Al concatenar entre comillas vacías, convierte el valor en una cadena. Si
myVar
ya es una cadena, la instrucción if es exitosa.fuente
typeof
.typeof
pero aún bastante más rápido quetoString
. De cualquier manera, supongo que me gusta la sintaxis para coaccionar.var s = new String('abc'); > s === s + '' > false
new String
cus que crea un tipo deobject
. w3schools.com/js/tryit.asp?filename=tryjs_string_object2fuente
false
.Me parece útil esta técnica simple para verificar el tipo de String -
La misma técnica también funciona para Number :
Y para RegExp -
Lo mismo para objetos -
NB, regexps, matrices y funciones también se consideran objetos.
Pero, verificar Array es un poco diferente:
Sin embargo, esta técnica no funciona para las funciones :
fuente
var x = new String(x); String(x)===x
devuelve falso sin embargo,({}).toString.call(x).search(/String/)>0
siempre regresa por cosasfunction isClass(x,re){return ({}).toString.call(x).search(re)>0;};
isClass("hello",/String/)
oisClass(3,/Number/)
oisClass(null,/Null/)
Una solución simple sería:
fuente
toString()
función.toString
ningún valor; pruebe si la x que se va a verificar es nula o indefinida, su excepción de lanzamiento de códigotoString()
método puede ser anulado y puede generar una excepción (debido a alguna implementación específica), y su verificación no funcionará con seguridad. La idea principal es que no debe llamar a métodos que no están relacionados con lo que desea obtener. Ni siquiera estoy hablando de gastos generales innecesarios relacionados con eltoString
método. Votación a favor.Un ayudante de Typechecker:
uso:
Además, si desea que sea recursivo (como Array que es un Objeto), puede usar
instanceof
.(
['cs'] instanceof Object //true
)fuente
Voy a tomar una ruta diferente al resto aquí, que intentará saber si una variable es un tipo específico o un miembro de un conjunto específico de tipos.
JS se basa en ducktyping; si algo grazna como una cadena, podemos y debemos usarlo como una cadena.
Es
7
una cuerda? Entonces, ¿por qué/\d/.test(7)
funciona?Es
{toString:()=>('hello there')}
una cuerda? Entonces, ¿por qué({toString:()=>('hello there')}) + '\ngeneral kenobi!'
funciona?Estas no son preguntas sobre si el trabajo anterior funciona, el punto es que lo hacen.
Así que hice una
duckyString()
funciónA continuación, pruebo muchos casos no atendidos por otras respuestas. Para cada uno el código:
duckyString()
debe normalizar las entradas para el código que espera cadenas realesEsto está en la misma línea en
!!x
lugar dex===true
probar algo si es como una matriz en lugar de necesitar una matriz real.jQuery objetos; son matrices? No. ¿Son lo suficientemente buenos? Sí, puedes ejecutarlos a través de
Array.prototype
funciones bien.Es esta flexibilidad la que le da a JS su poder y las pruebas para cadenas específicamente hace que su código sea menos interoperables.
La salida de lo anterior es:
Entonces, se trata de por qué quieres saber si algo es una cadena.
Si, como yo, llegaste aquí desde google y quisiste ver si algo era como una cadena , aquí hay una respuesta.
Ni siquiera es costoso a menos que esté trabajando con matrices de caracteres muy largas o profundamente anidadas.
Esto se debe a que es todo si las declaraciones, ninguna función llama como
.toString()
.Excepto si está tratando de ver si una matriz de caracteres con objetos que solo tienen
toString()
caracteres de varios bytes, en cuyo caso no hay otra forma de verificar, excepto hacer la cadena y contar los caracteres que componen los bytes, respectivamenteSe incluyen opciones para
.toString()
)Aquí hay más pruebas porque soy un finalista:
Salida:
fuente
Solo para ampliar la respuesta de @ DRAX , haría esto:
También tendrá en cuenta
null
syundefined
tipos, y se encargará de los tipos que no son de cadena, como0
.fuente
Esto es lo suficientemente bueno para mí.
ADVERTENCIA: Esta no es una solución perfecta. Ver el final de mi publicación.
Y puedes usar esto como a continuación.
ADVERTENCIA: esto funciona incorrectamente en el caso:
fuente
Puede usar esta función para determinar el tipo de cualquier cosa:
Para verificar si una variable es una cadena:
https://codepen.io/patodiblasi/pen/NQXPwY?editors=0012
fuente
No estoy seguro de si te refieres a saber si es un tipo
string
independientemente de su contenido, o si su contenido es un número o una cadena, independientemente de su tipo.Entonces, para saber si su tipo es una cadena, eso ya ha sido respondido.
Pero para saber en función de su contenido si es una cadena o un número, usaría esto:
Y para algunos ejemplos:
fuente
/^\d+$/.test('123')
para evitar las complejidades de los posibles problemas de análisis)