五.对象
1.对象的概念:Javascript中的对象是一组无序的相关属性和方法的集合,所有事物都是对象。例如字符串、数组、函数等等。
对象是由属性和方法组成的。
1)属性:事物的特征,在对象中用属性来表示(常用名词)
2)方法:事物的行为,在对象中用方法来表示(常用动词)
2.创建对象的方式
1)利用字面量来创建对象{}:采用键值对的形式,即属性名:属性值;
注意:多个属性之间用逗号隔开,方法冒号之后是一个匿名函数
var obj = {
name: 'Lindsay',
age: '18',
sayHi: function () {
console.log('Hi~');
}
}
2)利用new Object创建对象:利用等号赋值的方法添加对象的属性和方法,每个属性和方法之间用分号结束。
var obj = new Object();
obj.name = 'coco';
obj.age = 5;
obj.sayHi = function(){
console.log('Hi~');
}
3)利用构造函数创建对象:一次创建一个对象,有很多属性和方法都是重复的,那么就可以用函数的方法重复这些相同的代码,就是构造函数,里面封装的是对象。
注意:1)构造函数名的首字母需要大写;
2)构造函数不需要return就可以返回结果;
3)如果构造函数中有方法,方法中用到的参数不需要写到构造函数的形参中
function 构造函数名(形参){
this.属性 = 对应的形参值;
this.方法 = function(){
}
3.使用对象
1)调用对象的属性:对象名.属性名 或者 对象名[‘属性名’]
2)调用对象的方法:对象名.方法名();
3)调用构造函数:new 构造函数名(),返回的是一个对象;
注意:能使用点运算符一定可以使用中括号运算符,反之不一定成立
只能使用中括号的情况:
①使用了不能作为标识符的属性名的情况
②将变量作为属性名使用的情况
③将表达式的求职结果作为属性名使用的情况
4.变量、属性、函数和方法的区别:
1)变量和属性:他们都是用来存储数据的。其中变量是单独声明并赋值,使用的时候直接写变量名,单独存在;属性是在对象里面的不需要声明,使用的时候必须是对象.属性。
2)函数和方法:他们都是实现某种功能。函数是单独声明,并且调用的时候为函数名(),单独存在;方法在对象中,不需要声明,调用时为对象.方法名()。
5.构造函数和对象的关系:构造函数是泛指的某一类,对象是特指一个具体的事物。利用构造函数创建对象的过程也称为对象的实例化。
6.new关键字执行过程:
1)new 构造函数可以在内存中创建一个空的对象;
2)this就会指向刚才创建的空对象;
3)执行构造函数里面的代码,给这个空对象添加属性和方法;
4)返回这个对象(所以构造函数不需在这里插入代码片
要return)
7.遍历对象:for(变量 in 对象)
for(var k in hero1){
console.log(k);//输出得到的是属性名
console.log(hero1[k]);//输出得到的是属性值
}
六.内置对象
1.内置对象是指JS语言中自带的一些对象,这些对象供开发者使用,并提供一些常用的或是最基础而必要的功能(属性和方法)
2.查阅内置对象:MDN文档、W3C
3.经典案例:做一个倒计时
1)核心算法:输入时间减去现在的时间就是剩余的时间,但是不能直接时分秒相减,可能会产生负数;
2)解决办法:用时间戳来做。用户输入时间的总的毫秒数减去现在时间的总的毫秒数,得到的就是剩余时间的毫秒数;
3)把剩余时间的毫秒数转换为天、时、分、秒(时间戳转换为时分秒)
转换公式如下:
d = parseInt(总秒数/1000/60/60/24);//计算天数
h = parseInt(总秒数/1000/60/60%24);//计算小时
m = parseInt(总秒数/1000/60%60);//计算分数
s = parseInt(总秒数/1000%60);//计算秒数
4.数组对象 Array
1)判断是否为数组的方式:arr instanceof Array
或者Array.isArray(arr)
(H5新增的方法)
2)添加删除数组元素的方法
方法名 | 说明 | 返回值 |
---|---|---|
push(参数1…) | 末尾添加一个或多个元素,注意修改原数组 | 返回新的长度 |
pop() | 删除数组最后一个元素,把数组长度减1无参数,修改原数组 | 返回它删除的元素的值 |
unshift(参数1…) | 向数组的开头添加一个或更多的元素,注意修改原数组 | 返回新的长度 |
shift() | 删除数组的第一个元素,数组长度减1无参数,修改原数组 | 返回删除元素的值 |
5.数组排序
方法名 | 说明 |
---|---|
reverse | 颠倒数组中的源的顺序,无参数 |
sort | 对数组中的元素进行排序 |
其中,sort函数要注意:
1)如果不带参数,只能对1~9的数字进行升序排序,大于10只会按照单个数字进行排序
2)想要实现所有数字升序排序
var arr1 = [2,8,78,54,23];
arr1.sort(function (a,b) {
return b-a;
})
console.log(arr1);
//升序
arr1.sort(function (a,b) {
return a-b;
})
console.log(arr1);
6.获取数组元素的索引arr.indexOf()
从前往后找,返回元素的下标;
arr.lastIndexOf()
从后往前找,返回元素的下标;
注意:如果要查询的元素在数组中不存在,返回值是-1
//重要案例:数组去重
//思路:使用indexOf在新数组中查找旧数组中所有元素的下标,如果index为-1,那就使用push或者unshift方法将元素添加进新数组中
var str = ['c','a','z','a','x','a','x','c','b'];
var str1 = [];
for(var i = 0; i < str.length; i++){
var index = str1.indexOf(str[i]);
if(index === -1){
str1.push(str[i]);
}
}
console.log(str1);
7.将数组转换为字符串
方法名 | 说明 | 返回值 |
---|---|---|
toString() | 把数组转换为字符串,逗号分隔每一项 | 返回一个字符串 |
join(‘分隔符’) | 方法用于把数组中所有的元素转换为一个字符串 | 返回一个字符串 |
concat() | 连接两个或多个数组,不影响原数组 | 返回一个新数组 |
slice() | 数组截取slice(begin,end) | 返回被截取项目的新数组 |
splice | 数组删除splice(第几个开始,要删除的个数) | 返回被删除项目的新数组,注意,这个会影响原数组 |
8.字符串不可变:指的是里面的值不可变,虽然看上去可以改变内容,但其实是地址变了,内存中新开辟了一个内存空间。字符串中方的所有方法,都不会修改字符串本身,操作都会返回一个新的字符串。
9.根据位置返回字符(重点)
方法名 | 说明 |
---|---|
charAt() | 返回指定位置的字符(index字符串的索引号) |
charCodeAt(index) | 获取指定位置处字符的ASCII码(index索引号) |
str[index] | 获取指定位置处字符 |
10.字符串操作方法(重点)
方法名 | 说明 |
---|---|
concat(str1,str2,str3…) | concat()方法用于连接两个或者多个字符串,拼接字符串,等效于+,+更常用 |
substr(start,length) | 从start位置开始(索引号),length取的个数,重点记住这个 |
slice(start,end) | 从start位置开始,截取到end位置,end取不到 |
substring(start,end) | 从start位置开始,截取到end位置,end取不到,基本和slice相同,但是不接受负值 |
replace(a,b) | a是被替换的字符,b是替换的字符 |
split(‘分隔符’) | 根据分隔符对字符串进行分割,返回一个数组 |
11.简单数据类型与复杂数据类型
1)简单数据类型(值类型):在存储时变量中存储的是值本身,有string、number、Boolean、undefined、null(返回的是一个对象object)
2)复杂数据类型(引用类型):在存储时变量中存储的仅仅是地址(引用),通过new关键字创建的对象,如object、Array、Date等。
3)内存分配:
①简单数据类型是存放到栈里面,里面直接开辟一个空间,存放的是值;
②复杂数据类型首先在栈里面存放地址,用十六进制表示,这个地址指向堆里面的数据。
4)传参:
①简单数据类型传递的是值,函数内部的变化不会影响外部数据;
②复杂数据类型传递的是地址,不管外面还是里面,使用的都是同一个堆地址,所以不管在内部还是外部操作都会影响值。