Pregunta Compruebe si una variable es una cadena en JavaScript


¿Cómo puedo determinar si una variable es una cadena o algo más en JavaScript?


1172
2017-10-30 14:36


origen


Respuestas:


Puedes usar typeof operador:

var booleanValue = true; 
var numericalValue = 354;
var stringValue = "This is a String";
alert(typeof booleanValue) // displays "boolean"
alert(typeof numericalValue) // displays "number"
alert(typeof stringValue) // displays "string"

Ejemplo de esta página web. (El ejemplo fue ligeramente modificado, sin embargo).


1095
2017-10-30 14:40



Esto es lo que funciona para mí:

if (typeof myVar === 'string' || myVar instanceof String)
// it's a string
else
// it's something else

1457
2018-02-24 19:38



Dado que más de 580 personas votaron por una respuesta incorrecta, y más de 800 votaron por una respuesta de trabajo pero de estilo escopeta, pensé que podría valer la pena rehacer mi respuesta en una forma más simple que todos puedan entender.

function isString(x) {
  return Object.prototype.toString.call(x) === "[object String]"
}

O bien, en línea (tengo una configuración UltiSnip para esto):

Object.prototype.toString.call(myVar) === "[object String]"

FYI, la respuesta de Pablo Santa Cruz es incorrecta, porque typeof new String("string") es object

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é contra el voto popular).

Sin embargo, esta respuesta también es definitivamente correcta, y en realidad la mejor respuesta (excepto, tal vez, para la sugerencia de usar lodash/guion bajo) descargo de responsabilidad: contribuí a la base de código lodash 4.

Mi respuesta original (que obviamente voló sobre muchas cabezas) sigue:

Transcodifiqué esto de underscore.js:

['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'].forEach( 
    function(name) { 
        window['is' + name] = function(obj) {
              return toString.call(obj) == '[object ' + name + ']';
    }; 
});

Eso definirá isString, isNumber, etc.


En Node.js, esto se puede implementar como un módulo:

module.exports = [
  'Arguments', 
  'Function', 
  'String', 
  'Number', 
  'Date', 
  'RegExp'
].reduce( (obj, name) => {
  obj[ 'is' + name ] = x => toString.call(x) == '[object ' + name + ']';
  return obj;
}, {});

100
2017-07-21 11:59



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 compruebe si (A) la variable es una cadena literal o (B) es una instancia del objeto String. En cualquier caso, estas funciones identifican correctamente el valor como una cadena.

lodash / Underscore.js

if(_.isString(myVar))
   //it's a string
else
   //it's something else

jQuery

if($.type(myVar) === "string")
   //it's a string
else
   //it's something else

Ver Lodash Documentation for _.isString () para más detalles.

Ver Documentación jQuery para $ .type () para más detalles.


78
2018-01-06 20:43



function isString (obj) {
  return (Object.prototype.toString.call(obj) === '[object String]');
}

Lo vi aquí:

http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/


28
2017-07-24 19:07



Puedes usar esta fuente abierta reutilizable componente is-string para comprobar si una var es una cadena, evitando copiar y pegarla.

Ejemplos:

 isString(3) // => false
 isString('') // => true

Además, aquí está cómo isString se implementó en AngularJS:

function isString(value) {return typeof value === 'string';}

23
2018-02-10 13:10



Mejor manera:

var s = 'String';
var a = [1,2,3];
var o = {key: 'val'};

(s.constructor === String) && console.log('its a string');
(a.constructor === Array) && console.log('its an array');
(o.constructor === Object) && console.log('its an object');
(o.constructor === Number || s.constructor === Boolean) && console.log('this won\'t run');

Cada uno de estos ha sido construido por su función de clase apropiada, como "nuevo Objeto ()", etc.

Además, Duck-Typing: "Si se ve como un pato, camina como un pato y huele a pato, debe ser un Array" Significado, compruebe sus propiedades.

Espero que esto ayude.

Editar; 12/05/2016

Recuerde, siempre puede usar combinaciones de enfoques también. Aquí hay un ejemplo de cómo usar un mapa en línea de acciones con tipo de:

var type = { 'number': Math.sqrt.bind(Math), ... }[ typeof datum ];

Aquí hay un ejemplo más del "mundo real" del uso de mapas en línea:

function is(datum) {
    var isnt = !{ null: true, undefined: true, '': true, false: false, 0: false }[ datum ];
    return !isnt;
}
console.log( is(0), is(false), is(undefined), ... );  // >> true true false

Esta función usaría [custom] "type-casting" - más bien, "type - / - value-mapping" - para averiguar si una variable realmente "existe". Ahora puedes dividir ese pelo desagradable entre null& 0!

Muchas veces ni siquiera te importa su tipo. Otra forma de eludir el tipado es combinar conjuntos de tipo pato:

this.id = "998";  // use a number or a string-equivalent
function get(id) {
    if (!id || !id.toString) return;
    if (id.toString() === this.id.toString()) http( id || +this.id );
    // if (+id === +this.id) ...;
}

Ambos Number.prototype  y  String.prototype tener un .toString() method. Solo se aseguró de que el equivalente de cadena del número fuera el mismo, y luego se aseguró de pasarlo al http funcionar como un Number. En otras palabras, ni siquiera cuidado cuál era su tipo.

Espero que te dé más para trabajar con :)


15
2018-04-25 13:15



Tomado de lodash:

function isString(val) {
   return typeof val === 'string' || ((!!val && typeof val === 'object') && Object.prototype.toString.call(val) === '[object String]');
}

console.log(isString('hello world!')); // true
console.log(isString(new String('hello world'))); // true

7
2017-09-06 05:06