Question Vérifiez si une variable est une chaîne en JavaScript


Comment puis-je déterminer si une variable est une chaîne ou quelque chose d'autre dans JavaScript?


1172
2017-10-30 14:36


origine


Réponses:


Vous pouvez utiliser typeof opérateur:

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"

Exemple de cette page. (L'exemple a été légèrement modifié cependant).


1095
2017-10-30 14:40



C'est ce qui fonctionne pour moi:

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

1457
2018-02-24 19:38



Depuis 580+ personnes ont voté pour une réponse incorrecte, et 800+ ont voté pour une réponse de travail mais de style shotgun, je pensais que cela pourrait valoir la peine de refaire ma réponse dans une forme plus simple que tout le monde peut comprendre.

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

Ou, en ligne (j'ai une configuration UltiSnip pour cela):

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

FYI, la réponse de Pablo Santa Cruz est fausse, parce que typeof new String("string") est object

La réponse de DRAX est précise et fonctionnelle, et devrait être la bonne réponse (puisque Pablo Santa Cruz est tout à fait incorrect, et je ne discuterai pas contre le vote populaire.)

Cependant, cette réponse est également tout à fait correcte, et en fait la meilleure réponse (sauf, peut-être, pour la suggestion d'utiliser lodash/souligner). disclaimer: J'ai contribué à la base de code de lodash 4.

Ma réponse originale (qui a évidemment volé au-dessus de beaucoup de têtes) suit:

J'ai transcodé ceci de underscore.js:

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

Cela définira isString, isNumber, etc.


Dans Node.js, ceci peut être implémenté comme un module:

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



Je recommande d'utiliser les fonctions intégrées de jQuery ou lodash / Underscore. Ils sont plus simples à utiliser et plus faciles à lire.

L'une ou l'autre fonction traitera le cas mentionné par DRAX ... c'est-à-dire, ils tous les deux vérifiez si (A) la variable est une chaîne littérale ou (B) c'est une instance de l'objet String. Dans les deux cas, ces fonctions identifient correctement la valeur comme étant une chaîne.

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

Voir Documentation de lodash pour _.isString () pour plus de détails.

Voir Documentation jQuery pour $ .type () pour plus de détails.


78
2018-01-06 20:43



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

J'ai vu ça ici:

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


28
2017-07-24 19:07



Vous pouvez utiliser cet open source réutilisable composant is-string pour vérifier si une var est une chaîne tout en évitant de la copier-coller.

Exemples:

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

Aussi, voici comment isString a été implémenté dans AngularJS:

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

23
2018-02-10 13:10



Meilleur moyen:

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');

Chacun de ceux-ci a été construit par sa fonction de classe appropriée, comme "new Object ()" etc.

Aussi, Duck-Typing: "Si ça ressemble à un canard, marche comme un canard, et ça sent le canard - ça doit être un tableau" Signification, vérifiez ses propriétés.

J'espère que cela t'aides.

Modifier; 12/05/2016

Rappelez-vous, vous pouvez toujours utiliser des combinaisons d'approches aussi. Voici un exemple d'utilisation d'un carte en ligne des actions avec Type de:

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

Voici un exemple plus concret d'utilisation de cartes en ligne:

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

Cette fonction utiliserait [custom] "type-casting" - plutôt, "type - / - value-mapping" - pour savoir si une variable "existe" réellement. Maintenant, vous pouvez diviser ces cheveux méchants entre null& 0!

Plusieurs fois vous ne vous souciez même pas de son type. Une autre façon de contourner la frappe consiste à combiner des ensembles de type canard:

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) ...;
}

Tous les deux Number.prototype  et  String.prototype avoir un .toString() method. Vous venez de vous assurer que l'équivalent en chaîne du nombre était le même, et vous vous êtes assuré que vous l'avez passé dans le http fonctionner comme Number. En d'autres termes, nous n'avons même pas se soucier quel était son type.

J'espère que cela vous donne plus de travail avec :)


15
2018-04-25 13:15



Pris 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



J'aime utiliser cette solution simple:

var myString = "test";
if(myString.constructor === String)
{
     //It's a string
}

6
2017-11-06 21:21



Une solution simple serait:

var x = "hello"

if(x === x.toString(){
// it's a string 
}else{
// it isn't
}

5
2018-02-25 15:00