¿Cómo puedo verificar si un var es una cadena en JavaScript?

Respuestas:

381

Estuviste cerca:

if (typeof a_string === 'string') {
    // this is a string
}

En una nota relacionada: la comprobación anterior no funcionará si se crea una cadena new String('hello')como el tipo será en su Objectlugar. Hay soluciones complicadas para evitar esto, pero es mejor evitar crear cadenas de esa manera, siempre.

David Tang
fuente
1
Chicos, realmente les daría una respuesta aceptada a ambos, pero no puedo, todo lo que puedo hacer es +1 a ambos, que dar la respuesta aceptada a quién está más cerca de mi problema específico, que no he completamente explicado
vitto
esto funcionó para míif(typeof(str) === typeof(String()))
Scott Murphy
78

El typeofoperador no es un infijo (por lo que el LHS de su ejemplo no tiene sentido).

Necesitas usarlo así ...

if (typeof a_string == 'string') {
    // This is a string.
}

Recuerde, typeofes un operador, no una función. A pesar de esto, verás que typeof(var)se usa mucho en la naturaleza. Esto tiene tanto sentido como var a = 4 + (1).

Además, también puede usar ==(operador de comparación de igualdad) ya que ambos operandos son Strings ( typeof siempre devuelve a String), JavaScript está definido para realizar los mismos pasos que yo había usado ===(operador de comparación estricto).

Como menciona Box9 , esto no detectará un Stringobjeto instanciado .

Puedes detectar eso con ...

var isString = str instanceof String;

jsFiddle .

...o...

var isString = str.constructor == String;

jsFiddle .

Pero esto no funcionará en un windowentorno múltiple (piense iframe).

Puedes evitar esto con ...

var isString = Object.prototype.toString.call(str) == '[object String]';

jsFiddle .

Pero de nuevo, (como menciona Box9 ), es mejor que solo use el Stringformato literal , por ejemplo var str = 'I am a string';.

Lectura adicional .

alex
fuente
1
@ Box9 No te preocupes, de todos modos estoy cubierto de representantes: P
alex
@alex Yo también ahora: o (¡10 minutos más!)
David Tang
3
El límite de @RobG Rep es cuando has obtenido el máximo representante por un período de 24 horas. Después de eso, los votos a favor no cuentan para su reputación.
alex
¿No es posible verificar si una variable es una cadena simplemente probando la presencia de un miembro que solo tienen cadenas? Por ejemplo if(myVar.toUpperCase) alert('I am a string');:? Ver: jsfiddle.net/tb3t4nsx
ingrediente_15939
1
@ ingrediente_15939 no es realmente una buena manera ... por{ toUpperCase: '' }
alex
14

La combinación de las respuestas anteriores proporciona estas soluciones:

if (typeof str == 'string' || str instanceof String)

o

Object.prototype.toString.call(str) == '[object String]'
Alf Eaton
fuente
4

La siguiente expresión devuelve verdadero :

'qwe'.constructor === String

La siguiente expresión devuelve verdadero :

typeof 'qwe' === 'string'

La siguiente expresión devuelve falso (sic!):

typeof new String('qwe') === 'string'

La siguiente expresión devuelve verdadero :

typeof new String('qwe').valueOf() === 'string'

La mejor y correcta manera (en mi humilde opinión ):

if (someVariable.constructor === String) {
   ...
}
redisko
fuente
1

Hoy en día creo que es preferible usar una forma de función typeof () así que ...

if(filename === undefined || typeof(filename) !== "string" || filename === "") {
   console.log("no filename aborted.");
   return;
}
El maestro james
fuente
no hay forma de función typeof, solo estás controlando el orden de las operaciones con esos paréntesis. Algunas personas pueden encontrarlo más legible en ciertas circunstancias.
Jon z
@Jonz ¿Qué quisiste decir con "controlar el orden de las operaciones"? Gracias.
a20
Creo que más tarde me di cuenta de que puedes verificar el constructor y preferirlo, ya que en teoría pensé que sería más rápido, ¿pero no es más rápido? El ejemplo número 4 aquí muestra el uso de paréntesis developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… es definitivamente más legible y menos para que lo considere un análisis del compilador. Mi suposición sobre el 'orden' es posiblemente un problema de velocidad o relacionado con la forma en que el compilador carga la pila de argumentos, no estoy seguro.
Maestro James
1
El orden de operaciones @ a20 describe el orden en que se ejecutan las operaciones para las declaraciones que contienen múltiples operaciones. Consulte developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - los paréntesis (agrupación operativa) tienen la mayor prioridad de operador y, por lo tanto, se evalúan primero. En este caso, los paréntesis filenamesolo agrupan una sola declaración y, por lo tanto, son inútiles y extraños. Es bueno que esta respuesta tenga un puntaje de 0 porque es incorrecta, engañosa e inútil; Sería mejor si tuviera un puntaje negativo.
Jon z
Muy informativo gracias por el enlace. ¿Entonces los paréntesis se verifican y se ejecutan primero? así que eso debería ejecutarse de inmediato sin verificar a continuación otras formas de llamar también sin paréntesis, ¿cuáles serían los pasos posteriores y más lentos? ¿No? qué no entiendo sobre el compilador de tiempo de ejecución allí.
Maestro James
0

verificar nulo o indefinido en todos los casos a_string

if (a_string && typeof a_string === 'string') {
    // this is a string and it is not null or undefined.
}
Kurkula
fuente
typeof nully typeof undefinednunca volverá 'string', así que typeof a_stringes suficiente. Lo siento por necroposting
Ivan Frolov
-3

Mi enfoque personal, que parece funcionar para todos los casos, es probar la presencia de miembros que solo estarán presentes para las cadenas.

function isString(x) {
    return (typeof x == 'string' || typeof x == 'object' && x.toUpperCase && x.substr && x.charAt && x.trim && x.replace ? true : false);
}

Ver: http://jsfiddle.net/x75uy0o6/

Me gustaría saber si este método tiene fallas, pero me ha servido durante años.

ingrediente_15939
fuente
2
Esto es fácilmente engañado por cualquier objeto antiguo que tenga esos métodos.
alex
8
Esto se llama tipear patos; por ejemplo, si camina como una cadena y habla como una cadena, también podría ser una cadena. Estás un poco loco si crees que esta es la mejor manera de probar una cadena, pero Javascript es un Thunderdome, tú lo haces.
Jon z