157
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
  • 224,675
  • 49
  • 309
  • 312
DrStrangeLove
  • 10,539
  • 16
  • 57
  • 70
  • *related*: [JavaScript access string chars as array](http://stackoverflow.com/questions/4051385/javascript-access-string-chars-as-array) – Felix Kling Jun 26 '11 at 14:57
  • 1
    ar is an array variable but alert() takes string variables. :) – user979431 Jul 25 '14 at 18:45
  • Here is a simple possible solution : [Javascript function to read the each characters in a string](http://www.msccomputerscience.com/2017/02/javascript-function-to-read-each.html) – ARJUN Feb 07 '17 at 08:11

8 Answers8

257

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
  • 224,675
  • 49
  • 309
  • 312
149

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
  • 29,971
  • 11
  • 79
  • 96
21

.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
  • 3,651
  • 3
  • 16
  • 39
Orlin Georgiev
  • 1,301
  • 15
  • 18
20

It's as simple as:

s.split("");

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

pimvdb
  • 146,912
  • 75
  • 297
  • 349
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,063
  • 3
  • 26
  • 41
7

To support emojis use this

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

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

Murhaf Sousli
  • 11,806
  • 20
  • 109
  • 179
  • It breaks with `'Flag ️‍'.split(/(?!$)/u)` => `['F', 'l', 'a', 'g', ' ', '', '️', '‍', '']` – Shiva Nov 11 '21 at 04:14
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
  • 51,570
  • 19
  • 123
  • 158
  • 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
5

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

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

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

Gumbo
  • 620,600
  • 104
  • 758
  • 828