Check if a single character is a whitespace?

Viewed 55991

What is the best way to check if a single character is a whitespace?

I know how to check this through a regex.

But I am not sure if this is the best way if I only have a single character.

Isn't there a better way (concerning performance) for checking if it's a whitespace?

If I do something like this. I would miss white spaces like tabs I guess?

if (ch == ' ') {
    ...
}
10 Answers

While it's not entirely correct, I use this pragmatic and fast solution:

if (ch.charCodeAt(0) <= 32) {...

@jake 's answer above -- using the trim() method -- is the best option. If you have a single character ch as a hex number:

String.fromCharCode(ch).trim() === ""

will return true for all whitespace characters.

Unfortunately, comparison like <=32 will not catch all whitespace characters. For example; 0xA0 (non-breaking space) is treated as whitespace in Javascript and yet it is > 32. Searching using indexOf() with a string like "\t\n\r\v" will be incorrect for the same reason.

Here's a short JS snippet that illustrates this: https://repl.it/@saleemsiddiqui/JavascriptStringTrim

Based on this benchmark, it appears the following method would be most performant:

For Performance:

function isWhitespace(c) {
    return c === ' '
        || c === '\n'
        || c === '\t'
        || c === '\r'
        || c === '\f'
        || c === '\v'
        || c === '\u00a0'
        || c === '\u1680'
        || c === '\u2000'
        || c === '\u200a'
        || c === '\u2028'
        || c === '\u2029'
        || c === '\u202f'
        || c === '\u205f'
        || c === '\u3000'
        || c === '\ufeff'
}

There are, no doubt, some cases were you might want this level of performance (I'm working on a markdown converter and am trying to squeeze out as much performance as possible). However, in most cases, this level of optimization is unnecessary. In such cases, I would recommend something like this:

For Simplicity:

const whitespaceRe = /\s/
function isWhitespace(c) {
  return whitespaceRe.test(c)
}

This is more readable, and less likely to have a typo and, therefore, less likely to have a bug.

function hasWhiteSpace(s) {
  return /\s/g.test(s);
}

This will work

or you can also use this indexOf():

function hasWhiteSpace(s) {
  return s.indexOf(' ') >= 0;
}
Related