JavaScript对象
JavaScript普通对象
什么是对象
- 现实生活中:万物皆对象,对象是一个具体的事物,看得见摸得着的实物。例如,一本书、一辆汽车、一个人可以是“对象”,一个数据库、一张网页、一个与远程服务器的连接也可以是“对象”。
在 JavaScript 中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等。
对象是由属性和方法组成的。
属性:事物的特征,在对象中用属性来表示(常用名词)
方法:事物的行为,在对象中用方法来表示(常用动词)
为什么需要对象
保存一个值时,可以使用变量,保存多个值(一组值)时,可以使用数组。如果要保存一个人的完整信息呢?
例如,将“张三疯”的个人的信息保存在数组中的方式为:
1 | var arr = ["张三疯", "男", 128,154]; |
- JS 中的对象表达结构更清晰,更强大。张三疯的个人信息在对象中的表达结构如下:
创建对象
- 在 JavaScript 中,现阶段我们可以采用三种方式创建对象(object):
利用字面量创建对象
利用 new Object 创建对象
利用构造函数创建对象
字面量创建对象
对象字面量:就是花括号 { } 里面包含了表达这个具体事物(对象)的属性和方法。
{ } 里面采取键值对的形式表示
- 键:相当于属性名
值:相当于属性值,可以是任意类型的值(数字类型、字符串类型、布尔类型,函数类型等)
1 | // 1.利用对象字面量创建对象 {} |
- 对象的调用:
对象里面的属性调用 : 对象.属性名 ,这个小点 . 就理解为“ 的 ”
对象里面属性的另一种调用方式 : 对象[‘属性名’],注意方括号里面的属性必须加引号,我们后面会用
对象里面的方法调用:对象.方法名() ,注意这个方法名字后面一定加括号
1 | console.log(star.name) // 调用名字属性 |
- 案例:
1 | let dogo = { |
变量/属性/函数/方法
- 变量:单独声明赋值,单独存在
- 属性:对象里面的变量称为属性,不需要声明,用来描述该对象的特征
- 函数:单独存在的,通过“函数名()”的方式就可以调用
- 方法:对象里面的函数称为方法,方法不需要声明,使用“对象.方法名()”的方式就可以调用,方法用来描述该对象的行为和功能。
1 | // 变量、属性、函数、方法的区别 |
new Object创建对象
1 | var andy = new Obect(); // 创建一个空对象 |
- Object() :第一个字母大写
- new Object() :需要 new 关键字
- 使用的格式:对象.属性 = 值;
1 | // 利用 new Object 创建对象 |
- 案例:
1 | let man = new Object(); |
利用构造函数创建对象
构造函数 :是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与 new 运算符一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。
在 js 中,使用构造函数要时要注意以下两点:
构造函数用于创建某一类对象,其首字母要大写
构造函数要和 new 一起使用才有意义
1 | // 我们为什么需要使用构造函数 |
1 | // 利用构造函数创建对象 |
- 注意
- 构造函数约定首字母大写。
- 函数内的属性和方法前面需要添加 this ,表示当前对象的属性和方法。
- 构造函数中不需要 return 返回结果。
- 当我们创建对象的时候,必须用 new 来调用构造函数。
- 获取对象属性时,点和中括号方式的区别:
- 01 点方法后面跟的必须是一个指定的属性名称,中括号里面可以是变量
- 02 中括号里面的属性可以是数字,点方法后面的属性名不能是数字
- 03 动态为对象添加属性时,只能用中括号
案例_创建对象
1 | // 定义一个构造函数 |
构造函数和对象
- 构造函数,如 Stars(),抽象了对象的公共部分,封装到了函数里面,它泛指某一大类(class)
- 创建对象,如 new Stars(),特指某一个,通过 new 关键字创建对象的过程我们也称为对象实例化
1 | // 构造函数和对象 |
new 关键字
- new 在执行时会做四件事情:
- 在内存中创建一个新的空对象。
- 让 this 指向这个新的对象。
- 执行构造函数里面的代码,给这个新对象添加属性和方法。
- 返回这个新对象(所以构造函数里面不需要return)。
1 | // new关键字执行过程 |
遍历对象属性
- for…in 语句用于对数组或者对象的属性进行循环操作。
1 | for (变量 in 对象名字) { |
- 语法中的变量是自定义的,它需要符合命名规范,通常我们会将这个变量写为 k 或者 key。
1 | // 遍历对象 |
对象小结
- 对象可以让代码结构更清晰
- 对象复杂数据类型 object。
- 本质:对象就是一组无序的相关属性和方法的集合。
- 构造函数泛指某一大类,比如苹果,不管是红色苹果还是绿色苹果,都统称为苹果。
- 对象实例特指一个事物,比如这个苹果、正在给你们讲课的pink老师等。
- for…in 语句用于对对象的属性进行循环操作。
其他案例:
创建一个电脑对象,该对象要有颜色、重量、品牌、型号,可以看电影、听音乐、打游戏和敲代码。
创建一个按钮对象,该对象中需要包含宽,高,背景颜色和点击行为。
创建一个车的对象,该对象要有重量、颜色、牌子,可以载人、拉货和耕田。
写一个函数,实现反转任意数组。
写一个函数,实现对数字数组的排序。
1 | //... |
JavaScript内置对象
内置对象
JavaScript 中的对象分为 3 种:自定义对象 、内置对象、 浏览器对象
前面两种对象是 JS 基础内容,属于 ECMAScript; 第三个浏览器对象,属于我们 JS 独有的,我们JS API 讲解
内置对象就是指 JS 语言自带的一些对象,这些对象供开发者使用,并提供了一些常用的或是最基本而必要的功能(属性和方法)
内置对象最大的优点就是帮助我们快速开发
JavaScript 提供了多个内置对象:Math、 Date 、Array、String 等
Math对象
Math对象
- Math 对象不是构造函数,它具有数学常数和函数的属性和方法。跟数学相关的运算(求绝对值,取整、最大值等)可以使用 Math 中的成员。
1 | // Math.PI 圆周率 |
- 注意:上面的方法必须带括号
1 | // Math数学对象 不是一个构造函数 ,所以我们不需要new 来调用 而是直接使用里面的属性和方法即可 |
1 | // 1.绝对值方法 |
案例-封装自定义数学对象
- 利用对象封装自己的数学对象 里面有 PI 最大值和最小值
1 | // 利用对象封装自己的数学对象 里面有 PI 最大值和最小值 |
随机数方法random()
- random() 方法可以随机返回一个小数,其取值范围是 [0,1)
1 | //得到一个两数之间的随机整数,包括两个数在内 |
1 | // 1.Math对象随机数方法 random() 返回一个随机的小数 0 =< x < 1 |
案例-猜数字游戏
程序随机生成一个 1~ 10 之间的数字,并让用户输入一个数字:
- 如果大于该数字,就提示,数字大了,继续猜;
- 如果小于该数字,就提示数字小了,继续猜;
- 如果等于该数字,就提示猜对了, 结束程序。
1 | // 猜数字游戏 |
日期对象
Date概述
Date 对象和 Math 对象不一样,他是一个构造函数,所以我们需要实例化后才能使用
Date 实例用来处理日期和时间
Date()方法的使用
- 获取当前时间必须实例化
1 | // Date() 日期对象 是一个构造函数 必须使用new 来调用创建我们的日期对象 |
Date() 构造函数的参数
- 如果括号里面有时间,就返回参数里面的时间。例如日期格式字符串为‘2019-5-1’,可以写成 new Date(‘2019-5-1’) 或者 new Date(‘2019/5/1’)
- 如果Date()不写参数,就返回当前时间
- 如果Date()里面写参数,就返回括号里面输入的时间
- 如果括号里面有时间,就返回参数里面的时间。例如日期格式字符串为‘2019-5-1’,可以写成 new Date(‘2019-5-1’) 或者 new Date(‘2019/5/1’)
1 | // 2. 参数常用的写法 数字型 2019, 10, 01 或者是 字符串型 '2019-10-1 8:8:8' |
日期格式化
我们想要 2019-8-8 8:8:8 格式的日期,要怎么办?
需要获取日期指定的部分,所以我们要手动的得到这种格式。
案例-输出当前日期
1 | // 格式化日期 年月日 |
案例-输出当前时间
1 | // 格式化日期 时分秒 |
获取时间戳
Date 对象是基于1970年1月1日(世界标准时间)起的毫秒数
为什么计算机起始时间从1970年开始?
我们经常利用总的毫秒数来计算时间,因为它更精确
1 | // 获得Date总的毫秒数(时间戳) 不是当前时间的毫秒数 而是距离1970年1月1号过了多少毫秒数 |
案例-倒计时效果
案例分析:
- 核心算法:输入的时间减去现在的时间就是剩余的时间,即倒计时 ,但是不能拿着时分秒相减,比如 05 分减去25分,结果会是负数的。
- 用时间戳来做。用户输入时间总的毫秒数减去现在时间的总的毫秒数,得到的就是剩余时间的毫秒数。
- 把剩余时间总的毫秒数转换为天、时、分、秒 (时间戳转换为时分秒)
转换公式如下:
- d = parseInt(总秒数/ 60/60 /24); // 计算天数
- h = parseInt(总秒数/ 60/60 %24) // 计算小时
- m = parseInt(总秒数 /60 %60 ); // 计算分数
- s = parseInt(总秒数%60); // 计算当前秒数
1 | // 倒计时效果 |
字符串对象
基本包装类型
为了方便操作基本数据类型,JavaScript 还提供了三个特殊的引用类型:String、Number 和 Boolean。
基本包装类型就是把简单数据类型包装成为复杂数据类型,这样基本数据类型就有了属性和方法。
1 | // 下面代码有什么问题? |
字符串的不可变
- 指的是里面的值不可变,虽然看上去可以改变内容,但其实是地址变了,内存中新开辟了一个内存空间。
1 | var str = 'abc'; |
根据字符返回位置
- 字符串所有的方法,都不会修改字符串本身(字符串是不可变的),操作完成会返回一个新的字符串。
1 | // 字符串对象 ,根据字符返回位置 str.indexOf('要查找的字符', [起始的位置]) |
案例-返回指定字符的位置
查找字符串 “ abcoefoxyozzopp “ 中所有 o 出现的位置以及次数
案例分析:
- ① 核心算法:先查找第一个 o 出现的位置
② 然后 只要 indexOf 返回的结果不是 -1 就继续往后查找
- ③ 因为 indexOf 只能查找到第一个,所以后面的查找,利用第二个参数,当前索引加 1,从而继续查找
1 | // 查找字符串"abcoefoxyozzopp"中所有o出现的位置以及次数 |
根据位置返回字符
1 | // 根据位置返回字符 |
案例-返回字符位置
判断一个字符串 ‘abcoefoxyozzopp’ 中出现次数最多的字符,并统计其次数。
案例分析:
判断一个字符串 ‘abcoefoxyozzopp’ 中出现次数最多的字符,并统计其次数。
- ① 核心算法:利用 charAt() 遍历这个字符串
② 把每个字符都存储给对象, 如果对象没有该属性,就为1,如果存在了就 +1
- ③ 遍历对象,得到最大值和该字符对象 o { }
1 | // 有一个对象 来判断是否有该属性 对象['属性名'] |
字符串操作方法
toUpperCase() //转换大写
toLowerCase() //转换小写
1 | // 1. concat('字符串1','字符串2'....) |
replace()方法
replace() 方法用于在字符串中用一些字符替换另一些字符。
其使用格式如下:
- replace(被替换的字符串, 要替换为的字符串);
1 | // 1. 替换字符 replace('被替换的字符', '替换为的字符') 它只会替换第一个字符 |
split()方法
split() 方法用于切分字符串,它可以将字符串切分为数组。在切分完毕之后,返回的是一个新数组。
例如下面代码:
1 | var str = 'a,b,c,d'; |
1 | // 2. 字符转换为数组 split('分隔符') 前面我们学过 join 把数组转换为字符串 |
其他案例
给定一个字符串,如:“abaasdffggghhjjkkgfddsssss3444343”,问题如下:
- 1、 字符串的长度
- 2、 取出指定位置的字符,如:0,3,5,9等
- 3、 查找指定字符是否在以上字符串中存在,如:i,c ,b等
- 4、 替换指定的字符,如:g替换为22,ss替换为b等操作方法
- 5、 截取指定开始位置到结束位置的字符串,如:取得1-5的字符串
- 6、 找出以上字符串中出现次数最多的字符和出现的次数
- 7、 遍历字符串,并将遍历出的字符两头添加符号“@”
- 感谢你赐予我前进的力量