在现实中:万物皆对象,对象是一个具体的事物,看得见摸得着的实物,一个数据库,一张网页、一个远程服务器的连接也可以是‘对象’。
在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();
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();
因为前面两种的创建对象一次只能创建一个对象
因此可以利用函数的方法 重复相同代码 把这个函数称为构造函数
又因为这个函数不一样 , 里面分装的不是普通代码 ,而是 对象
构造函数 就是把对象里面一些相同的 属性 和 方法 抽象出来分装到函数里面
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、利用构造函数 创建对象的过程 也称为对象的实例化
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 数学对象 不是一个构造函数,所以不需要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 实例用来处理日期 和 时间
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)