写在前面
知识点:
- Math数学函数
- 绝对值abs / 取整ceil|floor / 四舍五入round / 最值max / 幂pow、开方sqrt / 随机数random
- 数组
- 常用CRUD:
- 增:push / unshift / splice
- 删:shift / pop / splice
- 改:splice
- 查:splice
- 数组拼接:contact
- 数组和字符串相互转换:toString / join
- 索引/包含索引值:indexOf / lastIndexOf / includes
- 排序
- 倒序:reverse
- 正序:sort (注意添加参数)
- 遍历:forEach
- 数组去重
- 数组塌陷
- 优化性能
- Set (ES6)
2.1.15 Math数学函数
math不是函数,是对象,对象存储操作数字属性方法
Math常用属性和方法
1、Math.abs([number value])
如果不是数字类型,先转换为数字类型(Number()转换)
2、Math.ceil/floor([number value])
把一个数向上取整/向下取整
Math.ceil(12.1) => 13
Math.ceil(-12.1) => -12
3、Math.round()四舍五入
Math.round(12.5) => 13
Math.round(-12.5) => -12
Math.round(-12.6) => -13
4、Math.max()
传递值是一堆数字
传递至是数组=> NaN
5、Math.sqrt()/pow()
开方
幂 Math.pow(2,10) => 1024
6、Math.random()
获取0-1之间随机小数
//[m,n]之间 Math.round(Math.random()*(m-n)+n)
2.1.16 数组
2.1.16.1 数组常用方法
- 方法作用及含义
- 方法实参
- 方法返回值
- 原来数组是否会发生改变
实现数组CRUD方法
push
向数组末尾增加内容
@params
多个任意类型
@return
新增后数组长度
let ary=[10,20]; let res=ary.push(20,'1',{name:'xxx'}); console.log(res,ary); => 5 [10,20,20,'1',{name:'xxx'}] //基于原生JS操作键值对方法,也可以 ary[ary.length]=40;
unshift
向开始位置增加
let ary=[10,20]; let res=ary.unshift(20,'1',{name:'xxx'}); console.log(res,ary); => 5 [20,'1',{name:'xxx'},10,20] ary[-1]=10; =>原生方法不能开头增加 //ES6展开运算符实现,克隆原有ary,在新数组创建第一项,实现开头增加效果 ary=[100,...ary];
shift
删除数组一项
@params
多个任意类型
@return
返回删除一项
let ary=[10,20,30,40]; let res=ary.shift(); console.log(res,ary); =>10 [20,30,40] //基于原生JS的delete,把数组当普通对象,可以删除一项,但是不会影响数组本身结构特点(length长度不会跟着改变),真实项目杜绝这样使用 let ary=[20,30,40]; delete ary[0]; console.log(ary);
pop
删除数组最后一项
@params
@return
返回删除一项
let ary=[10,20,30,40]; let res=ary.pop(); console.log(res,ary); =>40 [10,20,30] //基于原生JS让数组长度减少一位,默认减少最后一项 ary.length--; console.log(ary);
splice
实现数组的增加,删除,修改
- 删
@params
n,m数字,从索引n开始删除m个元素(m不写,删到末尾)
@return
把删除部分用新数组存起来返回
let ary=[10,20,30,40,50,60]; let res=ary.splice(2,3); console.log(res,ary);//=>[30,40,50] [10,20,60] //基于这种方法可以清空一个数组,把原始数组中的内容以新数组存储起来(有点类似克隆) let res=ary.splice(0); console.log(res,ary);//=>[10,20,30,40,50,60] [] //删除最后一项和第一项 ary.splice(ary.length-1); ary.splice(0,1);
- 修改/增加
@params
n,m,x数字,从索引n开始删除m个元素,用x占用删除部分
n,0,x数字,从索引n开始,一个都不删,把x放到索引n前面
@return
把删除部分用新数组存起来返回
let ary=[10,20,30,40,50,60]; let res=ary.splice(1,2,'xxx','ddd'); console.log(res,ary);//=>[20,30] [10,'xxx','ddd',40,50,60] //向数组末尾追加 let res=ary.splice(ary.length,0,'xxx'); //向数组开头追加 let res=ary.splice(0,0,'xxx');
slice
数组查询
- 查询
@params
n,m数字,从索引n开始找到索引为m的地方(不包括m),m不写,查到末尾
@return
把找到内容以新数组的形式返回
let ary=[10,20,30,40,50,60]; let res=ary.slice(1,3); console.log(res); //=>[20,30] //数组克隆,参数0不写也可以 res=ary.slice(0); //思考:如果n/m为负数/小数/非有效数字? //思考:如果n/m为负数? //思考:这种克隆是浅克隆,那么深度克隆怎么处理?
concat
数组拼接
@params
多个类型值
@return
拼接后的新数组(原数组不变)
let ary1=[10,20,30]; let ary2=[40,50,30]; let res =ary1.concat('111',ary2) console.log(res); //=>[10,20,30,'111',40,50,30]
toString
数组转字符串
@params
@return
转换后字符串,每一项逗号分隔(原数组不变)
let ary1=[10,20,30]; let res =ary1.toString() console.log(res); //=>'10,20,30'
join
把数组转换为字符串
@params
指定分隔符(字符串格式)
@return
转换后字符串,不指定分隔符,默认逗号(原数组不变)
let ary1=[10,20,30]; let res =ary1.join('|'); console.log(res); //=>'10|20|30' let ary1=[10,20,30]; let res =ary1.join('+'); console.log(res); //=>'10+20+30' console.log(eval(res)); //=>60 eval把字符串变为JS表达式执行
indexOf / lastIndexOf / includes
检测当前项在数组中第一次或最后一次出现的位置索引值(在IE6/7/8不兼容)
@params
要检索的这一项内容
@return
这一项出现的位置索引值(数字),如果数组中没有这一项,返回-1
includes 返回true/false
let ary=[10,20,30,10,20,30]; console.log(ary.indexOf(20)); console.log(ary.lastIndexOf(20)); console.log(ary.includes('xx'));=>false
2.1.16.2 排序/排列
reverse
把数组倒序排列
@params
@return
排列后的新数组,原来数组改变
let ary=[10,20,30]; console.log(ary.reverse()); => [30, 20, 10]
sort
把数组排序
@params
可以没有,也可以是个函数
@return
排列后的新数组,原来数组改变
let ary=[10,8,30,21]; //sort方法不传递参数,无法处理10以上的数字排序(默认按照第一个字符排序) console.log(ary.sort()); => [10, 21, 30, 8] //想要实现多位数正常排序,需要sort传递一个函数,函数中返回a-b实现升序,返回b-a实现降序(原理需要先了解冒泡排序) ary.sort((a,b)=> a-b ); console.log(ary); //=> [8, 10, 21, 30]
2.1.16.3 遍历数组中每一项方法
forEach
遍历数组每一项
@params
回调函数
@return
无
原数组不变
TIPS: 除了抛出异常以外,没有办法中止或跳出 forEach()
循环。如果你需要中止或跳出循环,forEach()
方法不是应当使用的工具。
//基于原生JS循环实现遍历 //基于forEach ary.forEach((item,index) => { //数组有多少项,函数就会被默认执行多少次 //每一次执行函数:item是数组中当前要操作一项,index是当前项索引 });
Array.prototype在控制台查询数组中所有提供的方法(MDN)
map
filter
reduce
some
every
...
2.1.16.4 数组去重
//思路一:创建新数组,添加原数组数据,验证每一项是否存在 ary=[1,2,3,1,2,3,1,2,3]; let newAry=[]; for(let i=0;i<ary.length;i++){ if(newAry.includes(ary[i])){continue;} newAry.push(ary[i]); } console.log(newAry); let ary=[1,2,3,1,2,3,1,2,3]; let newAry=[]; ary.forEach(item=>{ if(newAry.includes(item)) return; newAry.push(item); }) console.log(newAry);=>[1, 2, 3] //思路二:先分别拿出数组中的每一项,用这一项和它后面的每一项一次比较,如果遇到和当前项A相同的,则在原来数组中移除 var ary=[1,2,3,1,2,3,1,2,3]; for(let i=0;i<ary.length;i++){ //item:当前项 i:当前项索引 var item=ary[i]; for(let j=i+1;j<ary.length;j++){ var compare=ary[j]; if (compare === item){ ary.splice(j,1); } } } console.log(ary);=>[1, 2, 3, 3] //没实现原因:数组塌陷 //数组塌陷后,为了不让i继续累加,我们先把i-- var ary=[1,2,3,1,2,3,1,2,3]; for(let i=0;i<ary.length;i++){ //item:当前项 i:当前项索引 var item=ary[i]; for(let j=i+1;j<ary.length;j++){ var compare=ary[j]; if (compare === item){ ary.splice(j,1); //数组塌陷:j后面的每一项索引都提起一位下一次比较应该还是j这个索引内容 j--; } } }
优秀去重方法
//方法1: let ary = [1, 2, 3, 1, 2, 3, 1, 2, 3]; let newAry = {}; for (let i = 0; i < ary.length; i++) { newAry[ary[i]] === undefined ? newAry[ary[i]] = ary[i] : (ary.splice(i, 1),i--); } console.log(ary); console.log(newAry); //基于splice实现删除新跟那个不好,当前项被删除,后面每一项索引都要前提,如果后面内容过多,一定影响性能
//方法2:解决splice性能差 let ary = [1, 2, 3, 1, 2, 3, 1, 2, 3]; let newAry = {}; for (let i = 0; i < ary.length; i++) { if(newAry[ary[i]] === undefined){ newAry[ary[i]] = ary[i] }else{ ary[i]=ary[ary.length-1]; //最后一项移到这个位置 ary.length--; i--; } } console.log(ary); console.log(newAry);
unique
数组去重方法
创建方法注释写法:
@params
ary[Array] 要去重数组
@return
[Array] 去重后数组
by xxx on 1172104024
function unique(ary) { let newAry = {}; for (let i = 0; i < ary.length; i++) { let item=ary[i]; if (newAry[item] !== undefined){ ary[i] = ary[ary.length - 1]; ary.length--; i--; continue; } newAry[item]=item; } return ary; }
其他去重方法
//基于ES6,set方法 let ary =[12,23,12,15,25,23]; ary=[...new Set(ary)]; console.log(ary);