How can I check if a var is a string in JavaScript?
Asked Answered
B

6

216

How can I check if a var is a string in JavaScript?

I've tried this and it doesn't work...

var a_string = "Hello, I'm a string.";

if (a_string typeof 'string') {
    // this is a string
}
Bradford answered 8/6, 2011 at 23:42 Comment(2)
possible duplicate of Check whether variable is number or string in javascriptMullite
This is also a duplicate of Check if a variable is a string in JavaScriptHieronymus
P
460

You were close:

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

On a related note: the above check won't work if a string is created with new String('hello') as the type will be Object instead. There are complicated solutions to work around this, but it's better to just avoid creating strings that way, ever.

Phosphorus answered 8/6, 2011 at 23:43 Comment(3)
Guys, I really would give an accepted answer to both of you, but I can't, all I can do is +1 to both, than give the accepted answer at who is more near to my specific problem, that I've not fully explained.Bradford
this worked for me if(typeof(str) === typeof(String())) Sherrell
String() returns a string but new String() returns an objectSirois
O
83

The typeof operator isn't an infix (so the LHS of your example doesn't make sense).

You need to use it like so...

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

Remember, typeof is an operator, not a function. Despite this, you will see typeof(var) being used a lot in the wild. This makes as much sense as var a = 4 + (1).

Also, you may as well use == (equality comparison operator) since both operands are Strings (typeof always returns a String), JavaScript is defined to perform the same steps had I used === (strict comparison operator).

As Box9 mentions, this won't detect a instantiated String object.

You can detect for that with....

var isString = str instanceof String;

jsFiddle.

...or...

var isString = str.constructor == String;

jsFiddle.

But this won't work in a multi window environment (think iframes).

You can get around this with...

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

jsFiddle.

But again, (as Box9 mentions), you are better off just using the literal String format, e.g. var str = 'I am a string';.

Further Reading.

Ovate answered 8/6, 2011 at 23:43 Comment(5)
@Box9 No worries, I'm rep capped anyway :POvate
@Ovate I am now too :o (10 more minutes!)Phosphorus
@RobG Rep capped is when you have gained the maximum rep for one 24 hour period. After that, upvotes do not count towards your reputation.Ovate
Is it not possible to check if a variable is a string by simply testing for the presence of a member that only strings have? For example: if(myVar.toUpperCase) alert('I am a string');? See: jsfiddle.net/tb3t4nsxAzaria
@Azaria it's not really a good way... because of { toUpperCase: '' }Ovate
H
16

Combining the previous answers provides these solutions:

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

or

Object.prototype.toString.call(str) == '[object String]'
Hieronymus answered 6/2, 2014 at 14:42 Comment(0)
O
8

Following expression returns true:

'qwe'.constructor === String

Following expression returns true:

typeof 'qwe' === 'string'

Following expression returns false (sic!):

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

Following expression returns true:

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

Best and right way (imho):

if (someVariable.constructor === String) {
   ...
}
Otolith answered 16/7, 2018 at 21:33 Comment(0)
R
0

Now days I believe it's preferred to use a function form of typeof() so...

if(filename === undefined || typeof(filename) !== "string" || filename === "") {
   console.log("no filename aborted.");
   return;
}
Razee answered 27/6, 2016 at 21:17 Comment(6)
there is no function form of typeof, you're just controlling order of operations with those parentheses. Some people may find it more readable in certain circumstances.Listing
@Jonz What did you mean by "controlling order of operations"? Thanks.Chiclayo
I think later I realized you can check the constructor and prefer it as it in theory I thought would be faster but it's not faster? Example number 4 here show the parentheses usage developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… it's definately more readable and less for a compiler parsing to consider. My guess on the 'order' is possibly a speed issue or related to how the compiler loads the argument stack, I'm not sure.Razee
@Chiclayo order of operations describes the order in which operations are executed for statements that contain multiple operations. See developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - parentheses (Operating grouping) have the highest operator precedence and are therefore evaluated first. In this case, the parentheses around filename only group a single statement, and are therefore useless and extraneous. It's a good thing this answer has a score of 0 because it's wrong, misleading, and unhelpful; it would be better if it had a negative score.Listing
Very informative thanks for the link. So the parentheses are checked & run first? so that should run right away without checking next for other ways of calling aka without parentheses, which would be steps later and slower? no? what am I not understanding about the runtime compiler there.Razee
I prefer the constructor method now days, even if the performance monitors still don't say it's faster I figure it should be (and maybe I'm waiting until it does ha ha.)Razee
D
0

check for null or undefined in all cases a_string

if (a_string && typeof a_string === 'string') {
    // this is a string and it is not null or undefined.
}
Derbyshire answered 25/9, 2017 at 17:48 Comment(1)
typeof null and typeof undefined will never return 'string', so typeof a_string is enough. Sorry for necropostingHilariahilario

© 2022 - 2024 — McMap. All rights reserved.