字符串经产被当作字符数组,但是js中的字符串和字符数组并不是一回事,最多只是看上去相似而已。
字符串: var a = "foo";
字符数组: var b = ["f","o","o"];
字符串和数组的确很相似,他们都是类数组,都有length属性以及indexOf()和concat()方法
字符串不可变
在js中,字符串是不可变的,而数组是可变的。
字符串不可变指的是字符串的成员函数不会改变原始值,而是创建一个新的字符串。而数组的成员函数是在其原始值上进行操作。
a[1] = "O"; //这是个大写的O
b[1] = "O"; //这也是个大写的O
a; //"foo"
b; //["f","O","o"]
c = a.toUpperCase();
a === c; //false
a; //"foo"
c; //"FOO"
b.push("!");
b; //["f","O","o","!"]
”借用”数组方法
许多数组函数用来处理字符串很方便,虽然字符串没有这些函数,但可以通过“借用”数组的非变更方法来处理字符串
a.join; //undefined
a.map; //undefined
var c = Array.prototype.join.call(a,"-");
var d = Array.prototype.map.call(a,function(v){
return v.toUpperCase()+".";
}).join("");
c; //"f-o-o"
d; //"F.O.O."
字符串反转
数组有一个字符串没有的可变更成员函数reverse()
a.reverse; //undefined
b.reverse(); //["!","o","O","f"]
b; //["f","O","o","!"]
可惜我们无法"借用"数组的可变更成员函数,因为字符串是不可变的
Array.prototype.reverse.call(a);
//返回值仍然是字符串"foo"的一个封装对象(会报错)
这时小伙伴心想:难道没有办法破解了吗?
当然有啦~
一个破解的办法就是现将字符串转换成数组,待处理完后再将结果转换回字符串
var c = a
//将a的值转换成字符串数组
.split("")
//将数组中的字符进行翻转
.reverse()
//将数组中的字符拼接回字符串
.join("");
c; //"oof"
注:这种简单粗暴的方法对简单的字符串是适用的,对于包含复杂字符比如星号,多字节字符等的字符串并不适用哦
如果需要经常以字符数组的方式来处理字符串的话,倒不如直接使用数组,这样就不用在字符串和数组之间来回折腾,可以在需要时使用join("")将字符数组转换成字符串