2022.7.10 周日学习记录博客。今日学习时长:约3.5h。学习进度:内置对象(字符串对象)、简单数据类型和复杂数据类型。
目录
内置对象
目录
- 内置对象
- 查文档
- Math对下
- 日期对象
- 数组对象
- 字符串对象
6.字符串对象
6.1 基本包装类型
为了方便操作基本数据类型,JS 还提供了三个特殊的引用类型:String、Number 和 Boolean。
基本包装类型就是把简单数据类型包装成为复杂数据类型,这样基本数据类型就有了属性和方法。
按道理基本数据类型是没有属性和方法的,而对象才有属性和方法,上面代码中却可以执行,是因为 JS 会把基本数据类型包装成为复杂数据类型,其执行过程如下:
6.2 字符串的不可变
指的是里面的值不可变,虽然看上去可以改变内容,但其实是地址变了,在内存中新开辟了一个内存空间。
6.3 根据字符返回位置
字符串所有的方法,都不会修改字符串本身(字符串是不可变的),操作完成会返回一个新的字符串。
// 根据字符返回位置,str.indexOf('要查找的字符',[起始的位置])
var str = '改革春风吹满地,春天来了';
console.log(str.indexOf('春')); // 返回“2”
console.log(str.indexOf('春',3)); // 返回“8”,从索引号是3的位置开始从前往后查找
//案例:查找字符串'abcoefoxyozzopp'中 所有O出现的位置以及次数
//核心算法:先查找第一个O出现的位置
//然后 只要indexOf 返回的结果不是 -1 就继续往后查找
//因为 indexOf 只能查找到一个,所以需要利用循环,在当前索引加1后继续查找
var str = 'abcoefoxyozzopp';
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);
6.4 根据位置返回字符(重点)
//1.charAt(index) 根据位置返回字符
var str = 'andy';
console.log(str.charAt(3)); //返回y
//遍历所有字符
for(var i = 0;i < str.length;i++){
console.log(str.charAt(i));
}
//2.charCodeAt(index) 返回相应索引号的字符ASCII值。 通常用途:判断用户按下了键盘的什么键
console.log(str.charCodeAt(0)); //97(97是a的ASCII值)
//3.str[index] H5中新增的
console.log(str[0]); //返回a
案例:返回字符位置
判断一个字符串‘abcoefoxyozzopp’中出现次数最多的字符,并统计其次数
- 核心算法:利用 charAt()遍历这个数组
- 把每个字符都存储给对象的属性,如果对象没有该属性,就为1,如果存在了就 +1
- 遍历对象,得到最大值和该字符
var str = 'abcoefoxyozzopp';
var o ={};
for (var i = 0;i < str.length;i++){
var chars = str.charAt(i); //chars 是字符串的每一个字符
if(o[chars]){ //o[chars] 返回的是属性值
o[chars]++;
}else{
o[chars] = 1;
}
}
console.log(o);
//2. 遍历对象
var max = 0;
var ch ='';
for (var k in o){
// k 得到的是属性名
//o[k] 得到的是属性值
if (o[k] > max){
max = o[k];
max = o[k];
ch = k;
}
}
console.log(max);
console.log('最多的字符是' + ch);
6.5 字符串操作方法(重点)
//1.concat('字符串1','字符串2'.....)
var str = 'andy';
console.log(str.concat('red')); //返回结果 andyred
//2.substr('截取的起始位置','截取几个字符');
var str1 = '改革春风吹满地';
console.log(str1.substr(2,2)); //第一个2是索引号的2;第二个2是取几个字符
6.6 替换字符串、字符串转换成数组
- 替换字符 :replace(‘被替换的字符’,‘替换为的字符’)。 replace运算符只会替换遇到的第一个字符
- 字符转换为数组:split(‘分隔符’)。(之前学过 join 把数组转换为字符串)
//1.替换字符 replace('被替换的字符','替换为的字符');
var str - 'andyandy';
console.log(str.replace('a','b')); //输出:bndyandy。第二个a不替换
//案例:将字符串'abcoefoxyozzopp' 里所有的 o 替换为 *
var str1 = 'abcoefoxyozzopp';
while (str1.indexOf('o') !== -1){
str1 = str1.repkace('o','*');
}
console.log(str1);
//2.字符转换为数组 split('分隔符');
var str2 = 'red,pink,blue';
console.log(str2.split(',')); //返回数组 ['red','pink','blue'];
var str3 = 'red&pink&blue';
console.log(str3.split('&')); //返回数组 ['red','pink','blue'];
简单数据类型 与 复杂数据类型
复习target
- 能说出简单数据类型的内存分配
- 能说出复杂数据类型的内存分配
- 能说出简单类型如何传参
- 能说出复杂类型如何传参
目录
- 简单类型与复杂类型
- 堆和栈
- 简单类型的内存分配
- 复杂类型的内存分配
- 简单类型传参
- 复杂类型传参
1.简单类型和复杂类型
简单类型又叫做基本数据类型或者值类型,复杂类型又叫做引用类型。
- 值类型:简单数据类型 / 基本数据类型,在存储时变量中存储的是值本身,因此叫做值类型。string,number,boolean,undefined,null,(symbol)
- 引用类型:复杂数据类型,在存储时变量中存储的仅仅是地址(引用),因此叫做引用数据类型。包括通过 new 关键字创建的对象(系统对象、自定义对象) 如 Object、Array、Date等
2.堆和栈
堆和栈的分配区别:
1、栈(操作系统):有操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似与数据结构中的栈;简单数据类型存放到栈里面。
2、堆(操作系统):存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收。复杂数据类型存放到堆里面。
3.简单类型的内存分配
- 包括:string,number,boolean,undefined,null,(symbol)
- 简单类型变量的数据直接存放在变量(栈空间)中
4.复杂类型的内存分配
- 引用类型:通过 new 关键字创建的对象(系统对象、自定义对象) 如 Object、Array、Date等。
- 引用类型变量在栈空间里存放地址,而真正的对象实例存放在堆空间中。
5.简单类型传参
函数的形参也可以看做是一个变量,当我们把一个值类型变量作为参数传给函数的形参时,其实是把变量在栈空间里的值复制了一份给形参,那么在方法内部对形参做任何修改,都不会影响到外部的变量。
function fn(a){
a++;
console.log(a);
}
var x = 10;
fn(x);
console.log(x);
//第一个打印 输出的是11
//第二个打印 输出的是10
6.复杂类型传参
函数的形参也可以看做是一个变量,当我们把一个引用类型变量作为参数传给函数的形参时,其实是吧变量在栈空间里保存的堆地址复制给了形参,形参和实参其实保存的是同一个堆地址,所以操作的是同一个对象。
function Person(name){
this.name= name;
}
function f1(x) { // x = p; 把p引用地址传递给了X
console.log(x.name); //2. 输出 刘德华
x.name='张学友';
console.log(x.name); //3.输出 张学友
}
var p =new Person('刘德华');
console.log(p.name); //1.输出 刘德华
f1(p);
console.log(p.name); //4.输出 张学友