你不知道的 JavaScript 系列中, 6 -字符串

字符串经常被当成字符数组,但 JS 中的字符串和字符数组并不是一回事

var a = 'foo';
var b = ['f', 'o', 'o']

a.length; // 3
b.length; // 3

a.indexOf('o'); // 1
b.indexOf('o'); // 1

var c = a.concat('bar'); // 'foobar'
var d = b.concat('bar'); // ['f', 'o', 'o', 'b', 'a', 'r']

a === c; // false
b === d; // false

a; // 'foo'
b; // ['f', 'o', 'o']

但这并不意味着是字符数组,比如

a[1] = 'O';
b[1] = 'O';

a; // 'foo'
b; // ['f', 'O', 'o']

JS 中字符串是不可变的,而数组是可变的,并且 a[1] 并非是合法语法,正确的方法应该是 a.charAt(1)。字符串不可变是指字符串的成员函数不会改变其原始值,而是创建并返回一个新的字符串,而数组的成员函数都是在其原始值上进行操作

c = a.toUpperCase();
a === c; // false
a; // 'foo'
c; // 'FOO'

b.push('!');
b; // ['f', 'O', 'o', '!']

许多数组函数用来处理字符串很方便,虽然字符串没有这些函数,但可以通过借用数组的非变更方法来处理字符串

a.join; // undefined
var c = Array.prototype.join.call(a, '-');
c; // 'f-o-o'

a.map; // undefiend
c = Array.prototype.map.call(a, function(v){
  return v.toUpperCase()
}).join('')
c; // 'FOO'

另一个不同点在语字符串不能借用数组的可变更成员函数,比如 reverse();

a.reverse; // undefined
b.reverse(); // ['!', 'o', 'O', 'f']
b; // ['f', 'O', 'o', '!']

Array.prototype.reverse.call(a); // 报错,TypeError

一个变通的方法是先将字符串转换为数组,处理完后再转化为字符串

var c = a.split('').reverse().join('');
c; // 'oof'

这种方法简单粗暴,但对简单的字符串却完全适用