对象的创建

对象的含义

在现实中:万物皆对象,对象是一个具体的事物,看得见摸得着的实物,一个数据库,一张网页、一个远程服务器的连接也可以是‘对象’。

在JavaScript 中,对象是一组无序的相关属性方法的集合,所有实物都是对象,例如:字符串、数值、数组、函数等

属性:事物的特征,在对象中用属性来表示(常用名词)

方法:事物的行为,在对象中用方法来表示(常用动词)

为什么需要对象

保存一个值时,可以使用变量,保存多个值(一组值)时,可以用数组。但是要保存一个人的完整信息呢?

例如:将‘张三’的个人信息保存在数组中的方式为:

var arr = ['张三','男',128,154];

js中 的对象表达结构更清晰,更强大,张三的个人信息在对象中表达结构如下:

张三 . 姓名 = '张三';            person . name = '张三';
张三 . 性别 = '男';                person . sex = '男';
张三 . 年龄 = 23;                person . age = 23;
张三 . s身高 = 154;               person . height = 154;

创建对象的三种方式

在JavaScript 中,现阶段我们可以采用三种方式创建对象(object):

1、利用字面量创建对象(最常见)

        对象字面量:就是花括号{ } 里面包含了表达这个具体事物(对象)的属性和方法

{ } 里面采用了键值对的形式表示

                键 : 相当于属性名

                值 : 相当于属性值,可以是任意类型的值 (数字型 、字符串型、 布尔类型、 函数类型等)

var obj = {
    uname:'张三',//属性
    age:18,
    sex:'男',
    sayHi:function(){//方法
        console.log('hi~');
    
    }

}
(1)里面的属性或者方法 采取的是键值对的形式 键 属性名 : 值 属性值
(2)多个属性 或者方法 中间用逗号隔开
(3)方法 冒号后面跟的是一个匿名函数

使用对象

 (1)调用对象的属性 我们采取 对象名 . 属性名  (冒号.)  .  我们可以理解为  :的

console.log(obj.uname);

(2)调用属性还有一种方式   对象名['属性名'] 

console.log(obj['age']);

(3)调用对象的方法  sayHi 对象名.方法名()  不要忘记添加小括号

obj.sayHi();

2、利用new Object 创建对象 

var obj = new Object();
			obj.uname = '张三';
			obj.age = 18;
			obj.sex = '男';
			obj.sayHi = function(){
				console.log('hi');
			}
利用 等号 = 赋值 的方法 添加对象的属性和方法
每个 属性 和方法 之间用分号结束
        console.log(obj.uname);
        console.log(obj['sex']);
        obj.sayHi();

3、利用构造函数 创建对象

因为前面两种的创建对象一次只能创建一个对象 

因此可以利用函数的方法 重复相同代码  把这个函数称为构造函数

又因为这个函数不一样 , 里面分装的不是普通代码 ,而是  对象

构造函数 就是把对象里面一些相同的 属性 和  方法 抽象出来分装到函数里面

function 构造函数名(){
    this.属性 = 值;
    this . 方法 = function(){
    }
}
        new 构造函数名();

1、构造函数名的首字母必须要大写
2、构造函数不需要return 就可以返回结果
3、调用函数 必须使用  new
4、我们只要 new 构造函数名()调用函数就创建一个对象
5、属性 和 方法 前面必须添加 this
练习,用构造函数创建廉颇和后裔两个英雄对象
function Man(name,type,blood){
				this.name = name;
				this.type = type;
				this.blood = blood;
				this.attact = function(at){
					console.log(at)
				}
			}
			var lp = new Man('廉颇','力量型','500血量');
			console.log(lp.name);
			console.log(lp['type']);
			console.log(lp.blood);
			lp.attact('近战');
			
			var hy = new Man('后裔','射手座','100血量');
			console.log(hy.name);
			console.log(hy['type']);
			console.log(hy.blood);
			hy.attact('远程');

 构造函数和对象

1、构造函数  英雄 man  泛指某一大类 

2、对象 特指 是一个具体的事物 廉颇 后裔

3、利用构造函数 创建对象的过程 也称为对象的实例化

new 关键字的执行过程                                                      NEW和构造函数确认了眼神                     

1、new 构造函数 可以在内存中创建了一个空的对象                        1、他们俩生了个宝宝

2、this 就会指向刚才创建的空对象                                             2、这个宝宝必须是亲生的this指向

3、执行构造函数里面的代码 给 这个空对象添加的 属性 和 方法             3、教孩子读书一肚子墨水

4、返回这个对象                                                                                      4、长大挣钱回报父母

创建对象的三种方法

变量 、 属性、 函数、 方法总结

变量 和 属性 的相同点: 都是用来储存数据

        变量 单独申明并赋值  使用的时候 直接写变量名 单独存在

        属性 在对象里面 不需要声明 使用的时候 必须是 对象 . 属性

函数 和 方法 的相同点 : 都是实现某种功能 做某件事

        函数 是单独声明并且调用的 函数名() 单独存在

        方法 在对象里面 调用的时候 对象.方法()  方法用来描述该对象的行为和功能

遍历对象

for.....in 语句 用于对数组或者对象的属性进行循环操作。

for (变量 in 对象){

}
	var obj = {
				name:'五花',
				sex :'母',
				age :'11个月'
			}
			for(var k in obj){
				console.log(k);//得到的是属性名 name  sex  age
				console.log(obj[k])// 得到的属性值  五花 母 11个月
			}

使用for in 里面的 变量 最经常写  k  或者  key 

小结

1、对象 可以让代码结构更清晰

2、对象浮渣数据类型object

3、本质:对象就是一组无序的相关属性 和 方法 的集合

4、构造函数泛指某一大类,比如橘子,不管熟砂糖橘还是丑橘 都统称为橘子

5、对象实例特指一个事物,比如这个橘子

内置对象

JavaScript 中的对象分为三种:自定义对象、内置对象、浏览器对象

前面两种对象是JS基础内容 ,属于ECMAScript;第三种浏览器对象属于JS独有的

内置对象 就是指JS语言自带的一些对象,这些对象供开发者使用,并提供了一些常用的或是最基本而必要的功能(属性 和 方法)

JavaScript 提供了多个内置对象:MAth、Date、Array、String等

查文档

MDN

        学习一个内置对象的使用,只要学会其最常用成员的使用即可,我们 可以通过查文档,可以通过MDN/W3C来查询

如何学习对象中的方法

1、查阅该方法的功能

2、查看里面的参数和类型

3、查看返回值 的意义 和 类型

4、通过demo 进行测试

Math 对象

Math 数学对象 不是一个构造函数,所以不需要new 来调用 而是直接使用里面的属性和方法即可

console.log(Math.PI);//3.1415926535圆周率
console.log(Math.max(91,66,39,72,87));//直接得出最大值91
console.log(Math.max(91,66,'五花',72,87))/NAN
Math.PI//圆周率
Math.floor()//向下取整
Math.ceil()//向上取整
Math.round()//四舍五入版  就近取整 -3.5 结果是-3
Math.abs()//绝对值
Math.max()/Math.min()//求最大值和最小值

随机数方法 random()  返回一个随机的小数

日期对象

Date()日期对象 是一个构造函数 必须使用new 来调用创建 日期对象

Date对象 和 Math对象不一样,它是一个构造函数,所以我们需要实例化后才能使用

Date 实例用来处理日期 和 时间 

Date()方法的使用

1、获取当前时间必须实例化

var now = new Date();
console.log(now);

2、Date()构造函数的参数

如果括号里面有时间,就返回参数里面的时间,例如日期格式字符串为 '2019-5-1' ,可以写成new Date('2019/5/1')

时分秒案例
function getTime(){
				var time = new Date();
				var h = time.getHours();
				h = h < 10 ? '0' + h : h;
				var m = time.getMinutes();
				m = m < 10 ? '0' + m : m;
				var s = time.getSeconds();
				s = s < 10 ? '0' + s : s;
				return h + ':' + m + ':' + s;
				
			}
			console.log(getTime());

获取日期的总的毫秒形式(时间戳)

Date 对象 是基于1970年1月1日(世界)标准时间起的毫秒数

我们经常利用总的毫秒数来计算时间,因为它更精确

1、通过 valueof() getTime()

var date = new Date();
			console.log(date.valueOf());// 就是 现在的时间距离1970.1.1的总毫秒数
			console.log(date.getTime());

2、简单的写法 

var date1 = +new Date();//+new Date 返回的就是总毫秒数
			console.log(date1);

3、H5 新增的获得总的毫秒数(兼容性较低)

console.log(Date.now());

日期对象(倒计时案例)

1、核心算法:输入的时间减去现在的时间就是剩余的时间,即倒计时,但是不能拿着时分秒相减,比如03分减去24分,结果会使负数

2、用时间戳来做。用户输入时间总的毫秒数减去现在时间的总的毫秒数,得到的就是剩余时间的毫秒数

3、把剩余时间的总的毫秒数转化为天、时、分、秒(时间戳转化为时分秒)

转换公式
d = parselnt(总秒数/60/60/24);    //计算天数
h = parselnt(总秒数/60/60%24);    //计算小时
m = parselnt(总秒数/60/60%60);    //计算分数
s = parselnt(总秒数%60);         //计算当前秒数
function countDown(time){
				var nowTime = +new Date();//返回的是当前时间的总毫秒
				var inputTime = +new Date(time);//返回的是用户输入时间总的毫秒
				var times = (inputTime - nowTime) / 1000;  
				//time 是剩余时间的总的秒数
				var d = parseInt(times / 60 / 60 / 24);//得到天数
				d = d < 10 ? '0' + d : d;
				var h = parseInt(times / 60 / 60 %24);//得到小时
				h = h < 10 ? '0' + h : h;
				var m = parseInt(times / 60 %60);
				m = m < 10 ? '0' + m : m;
				var s = parseInt(times %60);
				s = s < 10 ? '0' + s : s;
				return d + '天' + h + '时' + m + '分' + s + '秒';
			}
			console.log(countDown('2022-3-19 12:00:00'));

数组对象

创建数组对象两种方式

字面量方式

var arr = [1,2,3];
console.log(arr[0]);

new Array()

var arr = new Array();//创建一个空数组
var arr = new Array(2);//这个2  表示 数组的长度为2  里面2 个空的数组元素
var arr = new Array(2,3);// 等价于[2,3] 这样写表示 里面有2 个数组元素  是 2 和 3

检测是否为数组

function reverse(arr){
				var newArr = [];
				for(var i = arr.length - 1;i >= 0;i--){
					newArr[newArr.length] = arr[i];
				}
				return newArr;
			}
			console.log(reverse([1,2,3]));

1、instanceof 运算符 它可以用来检测是否为数组

	console.log(reverse instanceof Array);

也可以用来当做条件判断

if(arr instanceof Array){
    ......

}else{
    return '这个参数要求必须是数组格式[1,2,3]'

2、Array.isArray()

Array.isArray(obj)

//obj:需要被检测的值

添加删除数组元素

方法名 说明 返回值
push(参数1...) 末尾添加一个或多个元素,注意修改原数组 并返回新的长度
pop() 删除数组最后一个元素,把数组长度减1 无参数、修改原数组 返回删除它的元素值
unshift(参数1....) 向数组的开头添加一个或多个元素,注意修改原数组 并返回新的长度
shift() 删除数组的第一个元素,数组长度减1无参数、修改原数组 并返回第一个元素的值
//1、posh()
var arr = [1,2,3];
arr.push(9,'五花');
console.log(arr)//1,2,3,9,五花
//2、unshift
arr.unshift('虎妞')
console.log(arr);//虎妞,1,2,3,9,五花
//3、pop
            arr.pop();
            console.log(arr.pop());//五花
			console.log(arr);//虎妞,1,2,3,9
//4、shift
            arr.shift();
			console.log(arr);//1,2,3,9

数组排序

方法名 说明 是否修改原数组
reverse() 颠倒数组中元素的顺序,无参数 该方法会改变原来的数组  返回新数组
sort() 对数组的元素进行排序 该方法会改变原来的数组 返回新数组
var arr = [99,9,11,1,36,6,44,47];
			arr.sort(function(a,b){
				return a - b;//升序  b - a 为降序
                
			});
			console.log(arr);

数组索引

方法名 说明 返回值
indexOf() 数组中查找给定元素的第一个索引 如果存在返回索引号 如果不存在,则返回-1
lastIndexOf() 在数组中的最后一个的索引 如果存在返回索引号 如果不存在,则返回-1
var arr = ['杨幂','马思纯','杨紫','赵丽颖'];
			console.log(arr.indexOf('杨紫'));//2

注意:若数组有重复的,则返回第一个索引号

lastIndexOf是从后往前查找的

数组去重

//去掉重复数组
			function unique(arr){
				var newArr = [];
				for(var i = 0;i < arr.length;i++){
					if(newArr.indexOf(arr[i])=== -1){
						newArr.push(arr[i]);
					}
				}
				return newArr;
			}
			var demo = unique(['c','a','z','a','x','a','x','c','b'])
			console.log(demo);

数组转换字符串

方法名 说明 返回值
toString() 把数组转换成字符串,逗号分隔每一项 返回一个字符串
join('分隔符') 方法用于把数组中的所有元素转换为一个字符串 返回一个字符串
var arr = [1,2,3];
			console.log(arr.toString());
var arr1 = ['皮卡丘','水箭龟','胖丁','小火龙','蚊香蛙','杰尼龟'];
			console.log(arr1.join('+'));//默认逗号分隔,这里分隔符为+ 则以+ 为分隔符
//皮卡丘+水箭龟+胖丁+小火龙+蚊香蛙+杰尼龟

字符串变量

基本包装类型

为了方便操作基本数据类型,JavaScript还提供了三个特殊的引用类型:String、Number 和Boolean

基本包装类型就是把简单数据类型包装成为复杂数据类型,这样基本数据类型就有了属性和方法

var str = 'andy';
console.log(str.length);

按道理基本数据类型是没有属性和方法的,而对象才有属性和方法,但上面代码却可以执行,这是因为js会把基本数据类型包装为复杂数据类型,其执行过程如下:

1、生成临时变量,把简单类型包装为复杂数据类型
var temp = new String('andy');

2、赋值给声明的变量
str = temp;

3、销毁临时变量
temp = null;

字符串不可变

指的是里面的值不可变,虽然看上去可以改变内容,但是其实地址变了,内存中新开辟了一个内存空间

var str = 'abc';
str = 'hello';
//当重新给 str 赋值的时候  常量'abc'不会被修改 依然在内存中
//重新给字符串赋值,会重新在内存中开辟空间 这个特点是字符串的不可变
//由于字符串的不可变 在大量拼接字符串的时候会有效率问题
var str = '';
for (var i = 0;i < 100000;i++)
    str += i;
}
console.log(str)//这个结果需要花费大量时间来显示,因为需要不断地开辟新空间

根据字符串返回位置

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

查找一组字符串里面o出现的次数与索引
var str = 'abcoefoxyozzopp';
			var index = str.indexOf('o');
			var num = 0;
			//console.log(str1);
				while(index !== -1){
					console.log(index);
					num++;
					index = str.indexOf('o', index + 1)
				}
			console.log('o出现的次数为:' +num );

根据位置返回字符串(重点)

方法名 说明 使用
charAt(index) 返回指定位置的字符(index 字符串的索引号) str.charAt(0)
charCodeAt(index) 获取指定位置处字符的ASCII码(index索引号) str.charCodeAt(0)
str[index] 获取指定位置处字符 HTML5,IE8+支持 和 charAt() 等效率
var str = 'apple';
			console.log(str.charAt(2));//p
			//遍历所有的字符
			for(var i = 0;i 
console.log(str.charCodeAt(2));//p的ASCII  为 112
console.log(str[0]);//a
统计出现最多的字符和次数
			//核心算法:利用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);
			//遍历对象
			var max = 0;
			var ch = '';
			for(k in o){
				//k 得到的是属性名
				//o[k]得到的是属性值
				if(o[k] > max){
					max = o[k];
					ch = k;
				}
			}
			console.log(max);
			console.log('最多的字符是:' + ch);
			

字符串操作方法(重点)

方法名 说明
concat(str1,str2,str3....) concat() 方法用于链接两个或多个字符,拼接字符串,等效于+ ,+更常用
substr(star,length) 从star 位置开始(索引号),length 取得个数 重点记住这个
slice (star,end) 从star位置开始,截取到end的位置,end取不到哦 (他们俩都是索引号)
substring(star,eng) 从star位置开始,截取到end位置,end截取不到  基本和slice 相同 但是不接受负值
替换字符串
        var str = '牛初乳蛋白';
			console.log(str.replace('牛','羊'));//羊初乳蛋白

注意:这时只会替换第一个字符

var str1 = 'abcoefoxyozzopp';
			while(str1.indexOf('o') !== -1){
				str1=str1.replace('o','*');
			}
			console.log(str1)

你可能感兴趣的:(javascript,开发语言,ecmascript)