字符串儿的一些事儿

244 阅读2分钟

字符串经产被当作字符数组,但是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"的一个封装对象(会报错)

这时小伙伴心想:难道没有办法破解了吗?

6ae14d46da983478d5d98f04d64f4c4.png

当然有啦~

一个破解的办法就是现将字符串转换成数组,待处理完后再将结果转换回字符串

   var c = a
   //将a的值转换成字符串数组
   .split("")
   //将数组中的字符进行翻转
   .reverse()
   //将数组中的字符拼接回字符串
   .join("");
   c;     //"oof"

注:这种简单粗暴的方法对简单的字符串是适用的,对于包含复杂字符比如星号,多字节字符等的字符串并不适用哦

如果需要经常以字符数组的方式来处理字符串的话,倒不如直接使用数组,这样就不用在字符串和数组之间来回折腾,可以在需要时使用join("")将字符数组转换成字符串