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); //张学友
函数的形参也可以看做一个变量,当我们把引用类型变量传给形参时,其实就是把变量在栈空间里保存的堆空间复制给了形参,形参和实参其实保存的是同一个堆地址,所以操作的是同一个对象。