js字符串对象

1、对象和复杂数据类型才会有属性和方法,简单数据类型想要有属性和方法需要经过基本包装类型。js会把简单数据类型包装成复杂数据类型,所以字符串也可以有str.length

2、字符串不可变性:里面的值不可变性,虽然看上去可以改变内容但是地址变了,内存中新开辟了一个内存空间

例:var str='abc';     str='hello';

当重新给str赋值时常量‘abc’不会被修改,依然在内存中,重新给字符串赋值会重新在内存中开辟空间,这个特点就是字符串的不可变性,由于字符串的不可变,在大量拼接字符串的时候会有效率问题。

3、字符串所有的方法都不会修改字符串本身(字符串本身是不可变的),操作完成会返回一个新的字符串。

indexOf(要查找的字符,开始的位置)返回指定内容在原字符串中的位置,如果找不到就返回-1,开始的位置是index索引号
lastindexOf()从后往前找,只找第一个匹配的
var str='oabcdgrohwnheooojns';
var index=str.indexOf('o');
var num=0;
while(index!=-1){
    console.log(index);
    num++;
    index=str.indexOf('o',index+1);
}
console.log('o出现的次数是'+num);

同理数组也是:

var arr=['red','blue','red','green','pink','red'];
var index=arr.indexOf('red');
var num=0;
while(index!=-1){
      console.log(index);
      num++;
      index=arr.indexOf('red',index+1);
}
console.log('red出现的次数是'+num);

4、根据位置返回字符

charAt(index)返回指定位置的字符(index字符串的索引号)str.charAT(0)
charCodeAt(index)获取指定位置处字符的ASCLL码(index索引号)str.charCodeAt(0)
str[index]获取指定位置处字符

HTML5,IE8+支持

和charAt()等效

var str='andy';
console.log(str.charAt(3));
for(var i=0;i<str.length;i++){
     console.log(str.charAt(i));
}
console.log(str.charCodeAt(0));
console.log(str[0]);
// 返回结果:y a n d y 97 a

5、案例:判断一个字符串中出现次数最多的字符,并统计个数

var str='abehsjnhhdooshaoomw';
var o={};
for(var i=0;i<str.length;i++){
     var chars=str.charAt(i);
     if(o[chars]){
         o[chars]++;
     }else {
         o[chars]=1;
     }
}
console.log(o);
var max=0;
var ch='';
for(var k in o){
    if(o[k]>max){
         max=o[k];
         ch=k;
    }
}
console.log(max);
console.log('最多字符是'+ch);

核心思路:利用charAt()遍历这个字符串;把每个字符都存储给对象,如果对象没有该属性就为1,如果存在就+1;遍历对象,得到最大值和该字符。

运行结果:

{a: 2 ,b: 1 ,d: 1,e:1, h:4, j:1, m:1 , n:1,o:4,s:2  , w:1}

4

最多字符是h.

注释:chars是字符串的每个字符,o[chars]得到的是属性值。

k得到的是属性名,o[k]得到的是属性值。

6、字符串操作方法:
 

concat(str1,str2,str3....)concat()方法用于连接两个或多个字符串,等效于+,+更常用
substr(start,length)从start位置开始(索引号),length取的个数
slice(start,end)从start位置开始,截取到end的位置,end取不到
substring(start,end)从start开始,截取到end的位置,end取不到,基本和slice相同但是不接受负值。

7、替换字符串:replace('被替换掉字符’,‘替换为的字符’)它只会替换第一个字符

把所有的字符都替换:

var str='abchdjskiehhoh';
while(str.indexOf('h')!=-1){
      str=str.replace('h','*');
}
console.log(str);

将字符转化为数组 split('分隔符’)   将数组转化为字符串:join()

8、转换大写:toUpperCase()  

转换小写:toLowerCase()

9、堆和栈

堆:复杂数据类型存放到堆里;

栈:简单数据类型存放在栈里;简单数据类型,在存储变量中存储的是值本身,因此叫做值类型

string,number,boolean,undefined,null.

复杂数据类型的内存分配:引用数据类型:通过new关键字创建的对象,如Object,Array,Date等

                                           引用数据变量:栈空间存放的是地址,真正的对象实例存放在堆空间中

 如果有个变量我们打算以后存储为对象,暂时没想好放啥,这个时候就给null,例:var time=null

var num=10;
num=20;
console.log(num);//输出20;
function fn(a){
     a++;
     console.log(a);//输出11
}
var x=10;
fn(x);
console.log(x);//输出10;

函数的形参也可以看做一个变量,当我们把一个值类型变量作为参数传给函数的形参时,其实是把变量在栈空间里的值复制了一份给形参,那么在内部对形参做任何修改都不会影响的外部变量。

 

function Person(name){

            this.name=name;

        }

function f1(x){

        console.log(x.name);  //刘德华

         x.name='张学友';

         console.log(x.name);   //张学友

 }

 var p=new Person('刘德华');

 console.log(p.name);     //刘德华

  f1(p);

  console.log(p.name);   //张学友

函数的形参也可以看做一个变量,当我们把引用类型变量传给形参时,其实就是把变量在栈空间里保存的堆空间复制给了形参,形参和实参其实保存的是同一个堆地址,所以操作的是同一个对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值