177
var s = "overpopulation";
var ar = [];
ar = s.split();
alert(ar);

I want to string.split a word into array of characters.

The above code doesn't seem to work - it returns "overpopulation" as Object..

How do i split it into array of characters, if original string doesn't contain commas and whitespace?

lonesomeday
  • 233,373
  • 50
  • 316
  • 318
DrStrangeLove
  • 11,227
  • 16
  • 59
  • 72

8 Answers8

280

You can split on an empty string:

var chars = "overpopulation".split('');

If you just want to access a string in an array-like fashion, you can do that without split:

var s = "overpopulation";
for (var i = 0; i < s.length; i++) {
    console.log(s.charAt(i));
}

You can also access each character with its index using normal array syntax. Note, however, that strings are immutable, which means you can't set the value of a character using this method, and that it isn't supported by IE7 (if that still matters to you).

var s = "overpopulation";

console.log(s[3]); // logs 'r'
lonesomeday
  • 233,373
  • 50
  • 316
  • 318
  • 3
    You can also access the string's characters in an array like fashion like so: `mystr = "apples"; mystr[0]; // a` – Brian FitzGerald Nov 24 '15 at 16:45
  • 9
    This does NOT work for emojis "".length #=> 1 "".chars #=> [""] – Murhaf Sousli Mar 24 '17 at 02:37
  • 4
    This does not consider wide characters. – user3751385 May 05 '17 at 01:40
  • This will not handle strings like this: `"⬆️⬆️⬇️⬇️⬅️➡️⬅️➡️️️"`. However, `[..."⬆️⬆️⬇️⬇️⬅️➡️⬅️➡️️️"]` and `Array.from("⬆️⬆️⬇️⬇️⬅️➡️⬅️➡️️️")` also won't handle this string correctly. To correctly handle this string you'll need to use a library like this one: https://www.npmjs.com/package/grapheme-splitter – Jonathan Leitschuh Mar 18 '23 at 03:19
177

Old question but I should warn:

Do NOT use .split('')

You'll get weird results with non-BMP (non-Basic-Multilingual-Plane) character sets.

Reason is that methods like .split() and .charCodeAt() only respect the characters with a code point below 65536; bec. higher code points are represented by a pair of (lower valued) "surrogate" pseudo-characters.

''.length     // —> 6
''.split('')  // —> ["�", "�", "�", "�", "�", "�"]

''.length      // —> 2
''.split('')   // —> ["�", "�"]

Use ES2015 (ES6) features where possible:

Using the spread operator:

let arr = [...str];

Or Array.from

let arr = Array.from(str);

Or split with the new u RegExp flag:

let arr = str.split(/(?!$)/u);

Examples:

[...'']        // —> ["", "", ""]
[...'']     // —> ["", "", ""]

For ES5, options are limited:

I came up with this function that internally uses MDN example to get the correct code point of each character.

function stringToArray() {
  var i = 0,
    arr = [],
    codePoint;
  while (!isNaN(codePoint = knownCharCodeAt(str, i))) {
    arr.push(String.fromCodePoint(codePoint));
    i++;
  }
  return arr;
}

This requires knownCharCodeAt() function and for some browsers; a String.fromCodePoint() polyfill.

if (!String.fromCodePoint) {
// ES6 Unicode Shims 0.1 , © 2012 Steven Levithan , MIT License
    String.fromCodePoint = function fromCodePoint () {
        var chars = [], point, offset, units, i;
        for (i = 0; i < arguments.length; ++i) {
            point = arguments[i];
            offset = point - 0x10000;
            units = point > 0xFFFF ? [0xD800 + (offset >> 10), 0xDC00 + (offset & 0x3FF)] : [point];
            chars.push(String.fromCharCode.apply(null, units));
        }
        return chars.join("");
    }
}

Examples:

stringToArray('')     // —> ["", "", ""]
stringToArray('')  // —> ["", "", ""]

Note: str[index] (ES5) and str.charAt(index) will also return weird results with non-BMP charsets. e.g. ''.charAt(0) returns "�".

UPDATE: Read this nice article about JS and unicode.

Onur Yıldırım
  • 32,327
  • 12
  • 84
  • 98
25

.split('') splits emojis in half.

Onur's solutions work for some emojis, but can't handle more complex languages or combined emojis.

Consider this emoji being ruined:

[..."️‍"] // returns ["", "️", "‍", ""]  instead of ["️‍"]

Also consider this Hindi text अनुच्छेद which is split like this:

[..."अनुच्छेद"]  // returns   ["अ", "न", "ु", "च", "्", "छ", "े", "द"]

but should in fact be split like this:

["अ","नु","च्","छे","द"]

This happens because some of the characters are combining marks (think diacritics/accents in European languages).

You can use the grapheme-splitter library for this:

It does proper standards-based letter split in all the hundreds of exotic edge-cases - yes, there are that many.

Aryan Beezadhur
  • 4,503
  • 4
  • 21
  • 42
Orlin Georgiev
  • 1,391
  • 16
  • 18
  • ["अ", "न", "ु", "च", "्", "छ", "े", "द"] is that right in the sense of the Hindi language, it's the right split – rajkanani Jul 06 '22 at 06:59
20

It's as simple as:

s.split("");

The delimiter is an empty string, hence it will break up between each single character.

pimvdb
  • 151,816
  • 78
  • 307
  • 352
11

The split() method in javascript accepts two parameters: a separator and a limit. The separator specifies the character to use for splitting the string. If you don't specify a separator, the entire string is returned, non-separated. But, if you specify the empty string as a separator, the string is split between each character.

Therefore:

s.split('')

will have the effect you seek.

More information here

Diana Ionita
  • 3,251
  • 3
  • 27
  • 42
7

A string in Javascript is already a character array.

You can simply access any character in the array as you would any other array.

var s = "overpopulation";
alert(s[0]) // alerts o.

UPDATE

As is pointed out in the comments below, the above method for accessing a character in a string is part of ECMAScript 5 which certain browsers may not conform to.

An alternative method you can use is charAt(index).

var s = "overpopulation";
    alert(s.charAt(0)) // alerts o.
Jamie Dixon
  • 53,019
  • 19
  • 125
  • 162
  • 2
    This does not work in all browsers though (not in some versions of IE: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String#section_5. – Felix Kling Jun 26 '11 at 14:55
  • Thanks Felix. I've updated my answer to include charAt as defined pre ECMAScript 5. – Jamie Dixon Jun 26 '11 at 15:01
6

To support emojis use this

('Dragon ').split(/(?!$)/u);

=> ['D', 'r', 'a', 'g', 'o', 'n', ' ', '']

Murhaf Sousli
  • 12,622
  • 20
  • 119
  • 185
  • It breaks with `'Flag ️‍'.split(/(?!$)/u)` => `['F', 'l', 'a', 'g', ' ', '', '️', '‍', '']` – Shiva Nov 11 '21 at 04:14
5

You can use the regular expression /(?!$)/:

"overpopulation".split(/(?!$)/)

The negative look-ahead assertion (?!$) will match right in front of every character.

Gumbo
  • 643,351
  • 109
  • 780
  • 844