Search code examples
javascriptstring

Check if a variable is a string in JavaScript


How can I determine whether a variable is a string or something else in JavaScript?


Solution

  • You can use typeof operator:

    var booleanValue = true;
    var numericalValue = 354;
    var stringValue = "This is a String";
    var stringObject = new String("This is a String Object");
    console.log(typeof booleanValue) // displays "boolean"
    console.log(typeof numericalValue) // displays "number"
    console.log(typeof stringValue) // displays "string"
    console.log(typeof stringObject) // displays "object"

    Example from this webpage. (Example was slightly modified though).

    This won't work as expected in the case of strings created with new String(), but this is seldom used and recommended against[1][2]. See the other answers for how to handle these, if you so desire.

    // Test this approach:
    
    let isString = value => typeof value === 'string';
    
    let falseCases = [
      [ 'null', null ],
      [ 'undefined', undefined ],
      [ 'object', { a: 1, b: 2 } ],
      [ 'array', [ 1, 2, 3 ] ],
      [ 'number', 123 ],
      [ 'zero', 0 ],
      [ 'RegExp', new RegExp('hello') ],
      [ 'number with valueOf returning string', Object.assign(10, { valueOf: () => 'abc' }) ],
      [ 'object pretending to be string', { constructor: String } ]
    ];
    let trueCases = [
      [ 'empty literal string', '' ],
      [ 'unicode string literal', String.fromCharCode(10000) ],
      [ 'empty boxed string', new String('') ],
      [ 'unicode boxed string', new String(String.fromCharCode(10000)) ],
      [ 'string with overwritten "constructor"', Object.assign('hi', { constructor: Array }) ],
      [ 'string with overwritten "toString"', Object.assign('hi', { toString: 123 }) ],
      [ 'string with overwritten "valueOf"', Object.assign('hi', { valueOf: 123 }) ],
      [ 'string with overwritten "constructor"', Object.assign('hi', { constructor: RegExp }) ],
      [ 'proxied string', new Proxy(new String('hello'), {}) ],
    ];
    
    console.log('NEGATIVE TESTS:');
    for (let [ name, val ] of falseCases) {
      console.log(`Test ${name}:\n  Expect: false\n  Got:    ${isString(val)}`); 
    }
    
    console.log('\nPOSITIVE TESTS:');
    for (let [ name, val ] of trueCases) {
      console.log(`Test ${name}:\n  Expect: true\n  Got:    ${isString(val)}`); 
    }


    1. The Google JavaScript Style Guide says to never use primitive object wrappers.
    2. Douglas Crockford recommended that primitive object wrappers be deprecated.