JS对象简介
尽管JavaScript里没有Java,但两者都是面向对象语言,按顺序学过java这部分也是大差不差。
在JavaScript中,对象是一组无序的相关属性和方法的集合。
对象中的属性均是键值对,属性名是键,属性值是值。
new关键字可以创建对象的实例。
1 | var chuckle = ['轻笑', 19, '男']; |
对象的属性值可以是任何的数据类型,也可以是个函数
1 | var obj = new Object(); |
对象的属性也可以是另一个对象
1 | var obj1 = new Object(); obj1.inObj; |
对象变量保存的是对象的地址,当两个变量指向同一个对象时,两个变量都可以修改对象中的属性。
对象的分类:
- 内置对象: 由ES标准中定义的对象,如:Object、Math、Date、String、Array、Number、Boolean、Function等。
- 宿主对象: 由JS的运行环境提供的对象,如浏览器提供了BOM、DOM,console、document。
- 自定义对象: 开发者创建的对象。
基本包装类型
基本数据类型string无法绑定属性和方法,但将其转换为基本包装类型,就可以。
1 | var str = ''; |
实际上,当我们对基本数据类型调用属性和方法(如str.length)时,js会自动将其临时转换为对应的基本包装类型(隐式类型转换),再调用内置方法。
基本包装类型包括:Number、Boolean、String,它们都属于引用数据类型,可以绑定属性和方法。
1 | var strObj = new String(''); |
String()
:将基本数据类型字符串,转换为 String 对象。Number()
:将基本数据类型的数字,转换为 Number 对象。Boolean()
:将基本数据类型的布尔值,转换为 Boolean 对象。
注意,在实际应用中一般不会使用基本数据类型的对象
在底层,字符串以字符数组的形式保存
1 | var str = 'chuckle';//保存方式["c", "h", "u", "c", "k", "l", "e"] |
内置对象
内置对象是语言自带的一些对象,提供了最基本最常用的属性和方法。
Arguments(函数参数集合),Array(数组),Boolean(布尔对象),Math(数学对象),Date(日期时间),Error(异常对象),Function(函数构造器),Number(数值对象),Object(基础对象),RegExp(正则表达式对象),String(字符串对象)
字符串对象String
字符串的所有方法,都不会改变原字符串
indexOf()/lastIndexOf()
:获取字符串中指定内容的索引search()
:获取字符串中指定内容的索引(参数里一般是正则)includes()
:字符串中是否包含指定的内容startsWith()
:字符串是否以指定的内容开头endsWith()
:字符串是否以指定的内容结尾charAt()
和str[index]
:返回字符串指定位置(下标)的字符charCodeAt(index)
:返回字符串指定位置的字符的 Unicode 编码slice()
:截取指定范围的字符串,可传入负值,代表倒数第几个字符(截取时包括该字符)substring()
:截取指定范围的字符串,不可**传入负值,传入负值转为0,自动调整参数的位置,如果第二个参数小于第一个,则自动交换substr()
:从起始位置截取指定长度的字符串,两个参数,起始位置,截取指定长度**String.fromCharCode()
:据字符的 Unicode 编码获取字符concat()
:拼接两个字符串,不如直接用+号split()
:字符串转换为数组 【重要】replace()
:替换字符串内容repeat()
:重复该字符串指定次数toUpperCase()
和toLowerCase()
:大小写转换trim()
:去除字符串头尾的空格
查找字符
1、indexOf()/lastIndexOf()
:获取字符串中指定内容的索引
indexOf()
从前向后查找,lastIndexOf()
从后向前,用法一致。
功能:检索一个字符串中是否含有指定内容。如果字符串中含有该内容,则会返回其第一次出现的字符串底层数组下标(0代表在开头);如果没有找到指定的内容,则返回 -1。
1 | var str = 'abc cba'; |
1 | var str = 'chuckle'; |
添加起始位置参数,指定查找的起始位置
1 | var str = 'chuckle'; |
案例:查找字符串”abcabcabc”中,所有 a 出现的位置以及次数
1 | var str = "abcabcabc"; |
2、search()
:获取字符串中指定内容的索引(参数里一般是正则)
功能:检索一个字符串中是否含有指定内容。如果字符串中含有该内容,则会返回其第一次出现的字符串底层数组下标(0代表在开头);如果没有找到指定的内容,则返回 -1。
1 | var str = 'CHUCKLE'; |
3、includes()
:字符串中是否包含指定的内容
功能:判断字符串中是否含有指定内容。有返回 true;否则返回 false。可以传入起始位置参数。
1 | var str = "chuckle"; |
4、startsWith()
:字符串是否以指定的内容开头
功能:判断字符串是否以指定的字符串开头。是返回 true;否则返回 false。可以指定起始位置下标,指定的位置则当做字符串开头。
1 | var str = "chuckle"; |
5、endsWith()
:字符串是否以指定的内容结尾
功能:判断字符串是否以指定的字符串结尾。是返回 true;否则返回 false。可以指定检索的字符串长度(检索到第几个字符)。
1 | var str = "chuckle" |
获取指定位置的字符
1、charAt()
和str[index]
:返回字符串指定位置(下标)的字符
1 | var str = "chuckle"; |
2、charCodeAt(index)
:返回字符串指定位置的字符的 Unicode 编码
1 | var str = "chuckle轻笑"; |
字符串截取
1、slice()
:截取指定范围的字符串,可传入负值,代表倒数第几个字符(截取时包括该字符)
1 | 新字符串 = str.slice(开始索引, 结束索引); |
1 | var str = "qxchuckle"; |
2、substring()
:截取指定范围的字符串,不可传入负值,传入负值转为0,自动调整参数的位置,如果第二个参数小于第一个,则自动交换。
1 | 新字符串 = str.substring(开始索引, 结束索引); |
1 | var str = "qxchuckle"; |
3、substr()
:从起始位置截取指定长度的字符串,两个参数,起始位置,截取指定长度
1 | 新字符串 = str.substr(开始索引, 截取的长度); |
1 | var str = "qxchuckle"; |
其它方法
String.fromCharCode()
:据字符的 Unicode 编码获取字符
1 | var a = String.fromCharCode(97); |
concat()
:拼接两个字符串,不如直接用+号,数组中也有此方法,用于两个数组的拼接,那边常用
1 | var str1 = "qx"; |
split()
:字符串转换为数组 【重要】
功能:通过指定的分隔符,将字符串拆分成数组,分隔符不会出现在数组中。不传入参数则将整个字符串作为数组的一个元素存入。
1 | var str = "qx,chuckle,轻笑"; |
replace()
:替换字符串内容
功能:将字符串中的指定内容,替换为一段字符串,默认只会替换第一个被匹配到的字符。如果要全局替换,需要使用正则。
1 | 新的字符串 = str.replace(被替换的子串,新的子串); |
1 | var str = "生活就像海洋,只有咕噜咕噜"; |
repeat()
:重复该字符串指定次数
1 | var str = "chuckle!" |
trim()
:去除字符串头尾的空格
1 | var str = ' a b c '; |
toUpperCase()
和 toLowerCase()
:大小写转换
1 | var str = 'abcdEFG'; |
html方法:不常用,多数是拼接成模板字符串返回
1 | var str = "chuckle"; |
数值对象Number
Number.isInteger()
:判断是否为整数toFixed(num)
:保留小数点后num位(四舍五入),返回字符串
Number.isInteger()
:判断是否为整数
1 | 布尔值 = Number.isInteger(数字); |
1 | var a = 10; |
toFixed(num)
:保留小数点后num位(四舍五入),返回字符串,将字符串转为整数可用Number(),详见数据类型转换—JavaScript基础笔记(1)
1 | 字符串 = nb.toFixed(num); |
1 | var nb = 3.1415926; |
数学对象Math
Math不是一个构造函数,无需创建对象即可直接使用其属性和方法,它是一个工具类,里面封装了数学运算相关的属性和方法。
Math.PI
:圆周率Math.abs()
:获取绝对值Math.random()
:生成0-1之间的随机浮点数,[0,1)Math.floor()
:向下取整(往小取值)Math.ceil()
:向上取整(往大取值)Math.round()
:四舍五入取整(正数四舍五入,负数五舍六入)Math.max(x, y, z)
:返回多个数中的最大值Math.min(x, y, z)
:返回多个数中的最小值Math.pow(x,y)
:乘方:返回 x 的 y 次幂Math.sqrt()
:开方:对一个数进行开方运算
Math.abs()
:获取绝对值,可传入字符串,自动做隐式转换。
1 | console.log(Math.abs(10));//10 |
Math.random()
:生成0-1之间的随机浮点数,[0,1)
1 | //生成 [0, x) 之间的随机整数 |
时间对象Date
Date用于处理日期和时间,Date是一个构造函数,需要new实例化后才能使用。
无参时获取系统时间
1 | var date = new Date(); |
传递参数,意思是给时间对象Date设定一个具体的时间,基准时间为1970年1月1日 00:00:00,具体小时差别要看时区,东八区+8小时。
1 | var date = new Date(传入毫秒数(时间戳));//表示基准时间加上这个毫秒数 |
1 | //传入2000毫秒,表示基准时间过2s |
常用方法
getFullYear()
:获取年份getMonth()
:获取月,0到11之间的整数值,表示从一月到十二月getDate()
:获取日:1-31getDay()
:获取星期:0-6,0代表星期日getHours()
:获取小时:0-23getMinutes()
:获取分钟:0-59getSeconds()
:获取秒:0-59getMilliseconds()
:获取毫秒setFullYear()
:修改日期,参数:年,月,日,时,分,秒,毫秒。返回时间戳toUTCString()
:将当日的日期(根据 UTC)转换为字符串toJSON()
:将日期转为json格式getTime()
:获取时间戳toLocaleString()
格式化输出 2023/4/12 09:39:49
1 | var date = new Date(1680076326495);//Wed Mar 29 2023 15:52:06 GMT+0800 (中国标准时间) |
toUTCString()
:将当日的日期(根据 UTC)转换为字符串
1 | var d = new Date();//Wed Mar 29 2023 16:11:02 GMT+0800 (中国标准时间) |
setFullYear()
:修改日期,参数:年,月,日,时,分,秒,毫秒,返回时间戳
1 | var d = new Date(2023,0); |
toJSON()
:将日期转为json格式
1 | var d = new Date(2023,0); |
获取时间戳
getTime()
:获取时间戳,也就是返回从基准时间至今的毫秒数(时间戳也可以是秒数,但函数返回的是毫秒数)。
1 | var date = new Date(2023,0); |
还有其它方法可以获取时间戳:
1 | var time1 = +new Date(); |
获取当前时间的时间戳可以用这种方法
1 | console.log(Date.now());//1680077268109 |
转为指定格式
使用 toLocaleString()
简单格式化输出
1 | new Date().toLocaleString(); |
也可以通过Date的prototype属性在原型上添加自定义的属性和方法,给Date对象添加format()方法,该方法封装如下:
1 | Date.prototype.format = function(fmt) { |
1 | var date = new Date(1680076326495);//Wed Mar 29 2023 15:52:06 GMT+0800 (中国标准时间) |
数组对象Array
下面是一个普通对象和数组对象:
1 | var obj = {name: 'chuckle' , age: 19 }; |
普通对象使用字符串作为属性名,而数组使用数字作为索引,数组适合用于存储同类型的一组数据,如列表数据。
数组中的元素可以是任意的数据类型,可以是对象、函数、数组。也可以同时存储不同类型数据。
1、使用字面量创建数组:
1 | var arr = []; // 创建空数组 |
2、使用构造函数创建数组对象:
1 | var arr = new Array(); // 创建空数组 |
JS中的数组会自动扩容,当我们访问数组大小以外的下标时,会返回undefined,但可以直接给超过数组大小的下标赋值,并自动给扩容的下标赋空属性,注意,空属性也会计入数组的长度 arr.length。
1 | var arr = [1, 2, 3]; |
解构赋值
解构赋值是ES6中新增的一种赋值方式。可以方便地把数组中的元素按顺序赋值给其他多个变量。
1 | var arr = [1, 2, [3,4]]; |
先指定变量的默认值,会被覆盖
1 | var arr = [1, 2, [3,4]]; |
ES6中新增的扩展运算符...
打包剩余的数据作为一个新数组。打包时扩展运算符只能写在最后。
1 | var [a, ...b] = [1, 2, 3]; |
数组属性和方法
arr.length
:数组的长度,数组中元素的个数
数组的方法:
- 类型相关方法:
Array.isArray()
:判断是否为数组toString()
:将数组转换为字符串join()
:将数组转换为字符串,可以指定分隔符Array.from()
:将伪数组或可遍历对象转为真数组Array.of(a,b,c)
:将多个值按顺序转为数组- 字符串的方法:
split()
:将字符串按指定的分隔符,组装为数组
- 元素的添加和删除:
push()
:从数组尾部插入任意数量元素,返回新数组的长度,改变原数组pop()
:删除数组中最后一个元素,返回被删除的元素,改变原数组unshift()
:从数组头部插入任意数量元素,返回新数组的长度,改变原数组shift()
:删除数组中第一个元素,返回被删除的元素,改变原数组splice()
:从数组中删除指定的任意数量元素,返回被删除元素组成的新数组,改变原数组slice()
:从数组中提取指定的任意数量元素,返回新数组,不改变原数组concat()
:合并多个数组,返回合并后的新数组,不改变原数组fill()
:用固定的值填充数组,返回新数组,改变原数组
- 数组排序:
reverse()
:反转数组,返回反转后的数组,改变原数组sort()
:排序,元素默认按照Unicode编码,从小到大进行排序,改变原数组
- 查找数组元素:
indexOf()
:从前往后搜索数组中的元素,并返回它首次所在位置的索引。lastIndexOf()
:从后往前搜索数组中的元素,并返回它首次所在位置的索引。includes()
:判断数组是否包含一个指定的值,返回布尔find(function())
:返回第一个符合传入测试(函数)条件的数组元素。findIndex(function())
:返回第一个符合传入测试(函数)条件的数组元素的索引。every(function())
:检测数组所有元素是否都符合指定(函数)条件,返回布尔some(function())
:检测数组是否存在符合指定(函数)条件的元素,返回布尔valueOf()
:返回数组本身,意义不大,数组名就代表该数组了
- 遍历数组:
for循环
遍历,大多数语言对于数组通用的遍历方法forEach()
传入一个回调函数作为参数,它由我们创建但是不由我们调用,数组中有几个元素,该回调函数就会执行几次,没用返回值for of
,ES6新增循环遍历数组方法map()
,遍历数组,并对数组中的每一项进行加工。filter()
:数组中的每一项运行回调函数,回调函数返回结果是true的项(符合条件的项),组成新数组返回,不改变原数组reduce()
:参数是接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值返回
类型相关方法
Array.isArray()
:判断是否为数组
1 | var a = []; |
toString()
:将数组转换为字符串,每一项用逗号分割。
大多数的数据类型都可以使用.toString()方法,将其转换为字符串。
1 | var a = [1,[2,3],{name:'chuckle',age:19},function(){}]; |
还可以使用String()
将数组转换为字符串
1 | var a = [1,[2,3],{name:'chuckle',age:19},function(){}]; |
join()
:将数组转换为字符串,可以指定分隔符,默认为逗号分割。
1 | var a = [1,[2,3],{name:'chuckle',age:19},function(){}]; |
可以使用JSON.stringify()
将某个对象转换成 JSON 字符串形式,数组中的空属性会转为null。
1 | var arr = []; |
字符串的方法:split()
:将字符串按指定的分隔符,组装为数组,默认为逗号分割,找不到指定分隔符时也会用逗号分割
1 | var str = "qx,chuckle,轻笑" |
Array.from()
:将伪数组或可遍历对象转为真数组
伪数组也有length属性,可以使用索引对数据进行操作,但是没有真数组的方法,因为该对象的原型不指向Array,需要将伪转真才能调用数组的方法。
伪数组一般不会直接创建,而是通过一些js操作得到,通过浏览器方法获取标签、字符串、接受实参的函数arguments得到参数的伪数组,因为伪数组具有长度和索引,所以可以使用循环语句遍历。
1 | var str = "chuckle"; |
Array.of(a,b,c)
:将多个值按顺序转为字符串,和new Array()
差不多,区别是只有一个参数时,在new Array()表示数组的长度,而在of()仍然代表数组的元素
1 | var arr = Array.of(1, [2,3], 'qx'); |
元素的添加和删除
push()
:从数组尾部插入任意数量元素,返回新数组的长度,改变原数组
1 | var arr = [1,2,3]; |
pop()
:删除数组中最后一个元素,返回被删除的元素,改变原数组
1 | var arr = [1,2,3]; |
unshift()
:从数组头部插入任意数量元素,返回新数组的长度,改变原数组
1 | var arr = [1,2,3]; |
shift()
:删除数组中第一个元素,返回被删除的元素,改变原数组
1 | var arr = [1,2,3]; |
splice()
:从数组中删除指定的任意数量元素,返回被删除元素组成的新数组,改变原数组
1 | 新数组 = 原数组.splice(起始索引); |
1 | var arr = [1,2,3,4,5]; |
搭配indexOf()
,删除指定内容的元素
1 | var arr = [1,2,3,4,5]; |
slice()
:从数组中提取指定的任意数量元素,返回新数组,不改变原数组
1 | 新数组 = 原数组.slice(开始位置的索引); |
1 | var arr = ['a', 'b', 'c', 'd']; |
concat()
:合并多个数组,返回合并后的新数组,不改变原数组
1 | var arr1 = [1, 2, 3]; |
数组合并的另一种方式:使用扩展运算符...
1 | var arr1 = [1, 2, 3]; |
fill()
:用固定的值填充数组,返回新数组,改变原数组
1 | // 数组中每一个元素都替换为该值 |
1 | var arr = new Array(6).fill(0)//创建一个元素均为0,长度为6的数组 |
数组排序
reverse()
:反转数组,返回反转后的数组,改变原数组
1 | var arr = ['a', 'b', 'c', 'd', 'e']; |
sort()
:排序,元素默认按照Unicode编码(逐个字符比较,非字符串先隐式转换为字符串),从小到大进行排序,返回排序后的新数组,改变原数组
1 | var arr = ['c', 'e', 'a', 'd', 'b'];// 乱序 |
当数组内元素是数字时,不能直接使用sort()排序,因为默认是按逐个字符的Unicode编码进行排序
1 | var arr = [7, 3, 11, 4, 1, 5]; |
对于非字符串排序(数字的排序),需要传入一个比较函数,有两个参数 a 和 b(可以是数组中任意元素)
arr.sort(Fun(a, b))
,a:第一个用于比较的元素,b:第二个用于比较的元素,数组按照比较函数的返回值进行排序,而不是Unicode编码。
JS规定了Fun(a, b)返回值的效果:
- 返回值小于0,让a排b前面
- 返回值大于0,让a排b后面
- 返回值等于0,a,b的相对位置不变
对于[7, 3, 11, 4, 1, 5]这个数组,比较11和4时,不带比较函数,会按Unicode编码从小到大排序,11会排在4前面,带比较函数后,因为a-b=7大于零,所以会让4排11前面。
1 | //实现整体升序(小到大) |
1 | var arr = [7, 3, 11, 4, 1, 5]; |
Fun(a, b)具体比较什么,什么情况返回大于0的数,什么时候返回小于0,需要自己去编写,所以可以实现商品的按价格排序:
1 | //这个数组中存放了几个商品对象,试着让它们按价格升序排序 |
1 | [ |
查找数组元素
indexOf()
: 从前往后搜索数组中的元素,并返回它首次所在位置的索引。lastIndexOf()
: 从后往前搜索数组中的元素,并返回它首次所在位置的索引。
找到元素返回其索引,没找到返回-1,严格类型约束,类似===。
1 | var arr = ['1', 2, 1, '2']; |
可以指定第二个参数,指定查找的起始位置,包括该位置
1 | var arr = [1, 2, 3, 4, 3, 2, 1]; |
includes()
:判断数组是否包含一个指定的值,严格类型约束,返回布尔,可以加上第二个参数规定查找的起始位置。
1 | var arr = [1, 2, '3', '4']; |
find(function())
:返回第一个符合传入测试(函数)条件的数组元素。findIndex(function())
:返回第一个符合传入测试(函数)条件的数组元素的索引。
找到符合条件的第一个元素就停止查找,没找到返回find()返回undefined,findIndex()返回-1
1 | var arr = [10, 20, 30, 40, 50, 60]; |
every(function())
:检测数组所有元素是否都符合指定(函数)条件,返回布尔,有一项返回 false 立刻停止遍历。some(function())
:检测数组是否存在符合指定(函数)条件的元素,返回布尔,有一项返回 true 立刻停止遍历。
every():全部真,才为真,some():一个真,就为真,
1 | var arr = [10, 20, 30, '40', '50', '60']; |
1 | var arr = [10, 20, 30, '40', '50', '60']; |
遍历数组
for循环
遍历,大多数语言对于数组通用的遍历方法
1 | var arr = [1, 2, 3, 4, 5]; |
这不够优雅,JS有更简单便捷遍历数组的方法
forEach()
传入一个回调函数作为参数,它由我们创建但是不由我们调用,数组中有几个元素,该回调函数就会执行几次,没用返回值
1 | arr.forEach(function (item, index, array) { |
回调函数中传递三个参数:
- 参数1(item):当前正在遍历的元素
- 参数2(index):当前正在遍历的元素的索引
- 参数3(array):正在遍历的数组
1 | var arr = [1, 2, 3, 4, 5]; |
在forEach()的回调函数中不能通过参数1(item)直接修改数组中的元素,但元素是一个对象时,可以访问并修改该对象的属性,这是因为数组中存放的是该对象的引用(地址)
1 | var arr = [1, 2, 3, 4, 5]; |
如果要修改数组中的元素,需通过参数2(index)和3(array),array[index]
来访问数组元素并修改
1 | var arr = [1, 2, 3, 4, 5]; |
纯粹只是遍历数组,可以用forEach(),但同时要修改元素时,最好使用map(),避免一些低级错误
for of
,ES6新增循环遍历数组方法
1 | var arr = [1, 2, 3, 4, 5]; |
for in
用于遍历无序的对象的属性,而不是有序的数组
1 | var obj = { |
map()
,遍历数组,并对数组中的每一项进行加工。
对数组中每一项运行回调函数,返回每一项加工后的结果,组成的新数组,不改变原数组。
1 | var newArr = arr.map((item, index, array) => { |
1 | var arr = [1, 2, 3, 4, 5]; |
常用案例:将 A 数组(通常存对象)中某个属性的值,存储到 B 数组中。
1 | var arr = [ |
filter()
:数组中的每一项运行回调函数,回调函数返回结果是true的项(符合条件的项),组成新数组返回,不改变原数组
1 | var arr = [7, 2, 3, 6, 7, 4]; |
1 | var arr = [ |
reduce()
:参数是接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值返回
reduce() 对于空数组不会执行回调函数
1 | var result = arr.reduce((prev, item, index, array) => {}, initialValue); |
回调函数参数解释:
- prev:必填,上一次调用回调函数时的返回值
- item:必填,当前正在处理的数组元素
- index:可选,当前正在处理的数组元素下标
- array:可选,该数组
- initialValue:可选,作为第一次调用回调函数时传给prev的值,最好手动初始化为0
举例 1、数组求和:
1 | var arr = [1, 2, 3, 4, 5, 6]; |
举例 2、统计某个元素出现的次数:
1 | var arr = [5, 2, 6, 4, 3, 6]; |
举例 3、找到最大的元素:
1 | var arr = [5, 2, 6, 7, 3, 6]; |