创建函数的方法
使用函数
函数的参数(形参和实参)
形参: 声明函数时候的小括号里面的参数
实参: 函数调用时候的小括号里面的参数
形参与实参个数对比
形参接收
形参接收
arguments: 是一个实参集合(伪数组)
剩余运算符...
function num(...arg) {
console.log(arg);//[1,2,3]
}
num(1, 2, 3);
function num(a,...arg) {
console.log(arg);//[2,3]
}
num(1, 2, 3);
//剩余运算符后面的变量叫做剩余参数,剩余参数后面不能还有形参
function num(...arg,c) {//报错
console.log(arg);
}
num(1, 2, 3);
...
运算符
在形参里面是剩余运算符
在函数里面是展开运算符
function num(...arg) {//在形参里面是剩余运算符
console.log(arg);//[1,2,3]
console.log(...arg);//1 2 3 在函数里面是展开运算符
}
num(1, 2, 3);
return 返回值
匿名函数常见写法
自调用函数常见写法
箭头函数
与正常函数的对比
function func(a, b) { return a + b };
var func = (a) => { return a + b };
简写
如果形参只有一个,省略小括号
如果函数体只有一条return语句,那就大括号和return都省略
var func = (a) => { return a + b };
var func = a => a + b;
回调函数的特点
可以认为参数是被当成实参的函数。
回调函数示例
var ary = [1, 2, 3];
ary.forEach(() => {
console.log('@@@@');
});
var ary = [1, 2, 3];
const myFunction =() => {
console.log('@@@@');
}
ary.forEach(myFunction);//函数myFunction是我自己声明定义的,并没有用小括号去调用它,它却会被执行。
字面量写法
var ary = [10, 20, 30];
console.log(ary);
使用操作符 [] 来读写数组的每一个元素, []中是数组的索引。
数组可以通过 length 属性获取数组的长度,也就是数组中元素的个数。
数组length属性的特别之处(他不是只读的,通过修改length,可以从数组末尾删除或添加元素)
读数组
var ary = [10, 20, 30];
var item = ary[2]// 读取数组中的元素
console.log(item);
写数组
var ary = [10, 20, 30];
ary[1]=100// 修改数组中的元素
console.log(ary);
length是数组的长度,代表元素的个数
稀疏数组
数组名[大小length的索引] 可以创建稀疏数组
var ary = [10, 20, 30];
ary[5] = 500;//创建稀疏数组
console.log(ary);//稀疏数组 [100,20,30,empty*2,500]
length属性的常见作用
var ary = [10, 20, 30];ary.length
var ary = [10, 20, 30];ary[ary.length - 1]
var ary = [10, 20, 30];ary.length--;//ary.length=ary.length-1;
var ary = [10, 20, 30];ary[ary.length] = 400;
遍历数组也叫迭代数组或循环数组
for循环
var ary2 = [10, 20, 30];
for (var i = 0; i < ary2.length; i++) {
console.log(ary2[i]);
}
for in循环
for (var key in 对象) {}
key是一个变量,一定要用中括号
循环数组
var ary2 = [10, 20, 30];
for (var key in ary2) {
console.log(key);//0 1 2
console.log(ary2[key]);//key是一个变量,一定要用中括号
}
可以用来循环对象
var obj = { a: 1, b: 2 }
for (var key in obj) {
console.log(key);
console.log(obj[key]);
}
// 创建多维数组
var cityList = [
['广州', '深圳', '佛山', '东莞', '惠州'],
['南京', '苏州', '徐州', '无锡', '南通'],
['济南', '青岛', '烟台', '潍坊', '淄博'],
['杭州', '宁波', '温州', '绍兴', '湖州']
];
// 多维数组取值
cityList[2][1];
学习思路
原生js的方法原则
push()
作用: 在原数组末尾
增加追加的元素
参数: 追加的元素
返回值: 加完之后原数组的长度
是否改变原数组: 改变
var ary = [10,20,30]
var res = ary.push(40,50)
console.log(res,'返回')//5 '返回'
console.log(ary,'原数组')//[10, 20, 30, 40, 50] '原数组'
pop()
作用: 删除原数组最后一项
参数: 无参数
返回值: 删除的那一项的值
是否改变原数组: 改变
var ary = [10,20,30]
var res = ary.pop()
console.log(res,'返回')//30 '返回'
console.log(ary,'原数组')//[10, 20] '原数组'
unshift()
作用: 在原数组开头
增加追加的元素
参数: 追加的元素
返回值: 加完之后原数组的长度
是否改变原数组: 改变
var ary = [10,20,30]
var res = ary.unshift(-10,0)
console.log(res,'返回')//5 '返回'
console.log(ary,'原数组')//[-10, 0, 10, 20, 30] '原数组'
shift()
作用: 删除原数组第一项
参数: 无参数
返回值: 删除的那一项的值
是否改变原数组: 改变
var ary = [10,20,30]
var res = ary.shift()
console.log(res,'返回')//10 '返回'
console.log(ary,'原数组')//[20, 30] '原数组'
reverse()
sort()
作用:数组排序
参数:排序条件
返回值:
是否改变原数组:
示例
var ary = [30, 15, 2];
// 不填参数,只能排10以内
// var returnValue = ary.sort();
// >=10要传参数
var returnValue = ary.sort(function (a, b) {
return a - b;//升序
// return b - a;//降序
});
console.log(returnValue, '返回值');
console.log(ary, '原数组');
(a, b)=>a - b
升序(a, b)=>b - a
降序回调函数
有一些第三方函数
,要求自己传入一个固定入参及固定出参类型的函数
,我们所写的那个固定入参及固定出参类型的函数
相对于那个第三方函数
就是回调函数
。
第三方函数
来说,回调函数
的出入参的个数及数据类型都是固定的,他们只是传入固定的入参,得到一个固定类型的出参。固定入参及固定出参类型的函数
来说,我们要写固定数量及类型的形参
及一个固定类型的出参
。到时会有不同的形参值传入并执行多次,每次结果都可能不一样。var ary = [10, 5, 8];
ary.sort((a, b) => a - b);//`(a, b) => a - b`就是回调函数
//ary.sort(function (a, b) { return a - b; });
//内部函数实际上就是类似于这样调用。
function sort(callback) {
//执行时 ,callback指的就是传进来的箭头函数`(a, b) => a - b`,不同的执行条件,callback函数也不一样。但基本上入参及返回值是确定的,入参是函数内控制,而返回值则是函数定义后开放标准,由回调函数来实际书写的,但一般一定会有个符合回调函数要求的返回值。
callback()
}
sort((a, b) => a - b)
splice()
作用:增删改一体化
参数:
返回值:删除的元素,数组包着
是否改变原数组:改变
var ary = [10, 20, 30];
// @1 没有传参数 什么也没做
// var returnValue = ary.splice();
// @2 第一个参数是开始删除的位置(下标)
// 从下标为1开始,往后全部删除
// var returnValue = ary.splice(1);//[20,30]
// @3 第二个参数是删除的个数
// var returnValue = ary.splice(1, 1);//[20]
// @4 第三个参数,以及三往后的参数,都是添加的元素
// var returnValue = ary.splice(1, 1, 111, 222);//[20]
// var returnValue = ary.splice(0, 1);//删除第一项
// var returnValue = ary.splice(ary.length-1, 1);//删除最后一项
// 在开头添加一项
// var returnValue = ary.splice(0,0,111);
// 在末尾追加一项
var returnValue = ary.splice(ary.length,0,'haha');
console.log(returnValue, '返回值');//[]
console.log(ary, '原数组');
slice(startIndex,endIndex)
作用:从原有的数组中选中特定的内容
参数:可以有一个或者两个
返回值:返回值是一个数组,返回的每一项是复制的项
是否改变原数组:不改变
注意:
数组变量名.slice(0);
var arr=[10,20,30,40,50];var newarr=arr.slice(0);
concat()
作用:实现多个数组或者值的拼接
参数:数组或者值
返回值:返回值是拼接后的新数组
是否改变原数组:不改变
var ary1 = [1, 2, 3];
var ary2 = [4, 5, 6];
var res = ary1.concat(ary2, "珠峰", "同学");
console.log(ary1);//[1, 2, 3]
console.log(res);//[1, 2, 3, 4, 5, 6, '珠峰', '同学']
toString()
作用:可以把一个数组转换为字符串
参数:无
返回值:返回值是转换后的字符串
是否改变原数组:不改变
var ary1 = [1, { a: 1 }, null, undefined, 3];
var res = ary1.toString();
console.log(ary1);//[1, {a:1},null, undefined, 3]
console.log(res)//1,[object Object],,,3
,
拼接
alert()方法
最终体现的是字符串
,会调用toString()
join()
作用:把数组通过指定的连接符,转换为字符串
参数:连接符
返回值:返回值是转换后的字符串
是否改变原数组:不改变
var ary1 = [1, 2, undefined, 3, { a: 1 }];
var res = ary1.join("|");
console.log(ary1);//[1, 2, undefined, 3, { a: 1 }]
console.log(res)// 1|2||3|[object Object]
eval(res) //==> eval 执行计算,会报错
不写参数时,默认,
拼接
有参数时,参数是什么就用什么来拼接
拼接符为+
,可配合eval()
做加法
可以用这个来做简易计算器
var arr=[10,20,30];
var newstr=arr.join("+");
//newstr => "10+20+30"
//eval(newstr) => eval("10+20+30") => 60
console.log(eval(newstr));
indexOf()
/lastIndexOf()
作用:获取某项在数组中(首次出现/最后出现的) 索引(也可以用来是否包含某项)
参数:(n,m)
返回值:-1或者具体的索引值
是否改变原数组:不改变
//+ 作用:检测数组中的某项在数组中(首次indexOf/最后lastIndexOf)出现的位置
var ary=[1,2,3,4,1,55,1];
//检测1这个项目在数组ary 中首次出现的位置
ary.indexOf(1); //0
//从索引2开始,检测1这个项目在数组中首次出现的位置
ary.indexOf(1,2); //4
// 检测1这个项目在数组中最后一次出现的索引
ary.lastIndexOf(1);
// 检测1这个项目在数组中最后出现的索引,在索引5的位置停止检测
ary.lastIndexOf(1,5)
//如果此项在数组中没有出现,返回值就是-1
ary.indexOf(66)===>-1
includes()
作用:检测数组中是否包含某一项
参数:具体项
返回值:布尔值
true
false
是否修改原数组:不改变
var arr=[10,20,30,10];
console.log(arr.includes(10));//true
console.log(arr.includes(100));//false
console.log(arr);//[10,20,30,10];
forEach()
数组的迭代方法 类似for循环
作用:遍历数组中的每一项
参数:函数
返回值:undefined
是否修改原数组:不改变
示例:
var arr=[10,20,30];
for(var i=0;i<arr.length;i++){
console.log(arr[i]);
console.log(i);
console.log(arr);
}
var arr=[10,20,30];
var res = arr.forEach((item,index,ary)=>{
console.log(item);
console.log(index);
console.log(ary);
})
var arr=[10,20,30];
var res = arr.forEach((item,index,ary)=>{
console.log(item);
console.log(index);
console.log(ary);
return (item * 5)
})
console.log(res,'返回值');//undefined '返回值'
console.log(arr,'原数组');//[10,20,30] '原数组'
map()
作用:把一个数组可以映射成一个新的数组
参数:函数
返回值:映射后的新数组
是否修改原数组:不改变
示例:
var arr=[100,200,300];
var res = arr.map((item,index,ary)=>{
console.log(item);
console.log(index);
console.log(ary);
return item+10;
})
console.log(res,'返回值');//[110,210,310] '返回值'
console.log(arr,'原数组');//[100,200,300] '原数组'
可以用索引 in 数组
来判断一个位置是否是空,还是undefined。
数组代表一个家庭的年龄,过年了,每个人长1岁
map()
var userAages = [19,21,18,34,32,25,45];//[20,22,19...]
var newuserAages=userAages.map(item=>item+1)
console.log(newuserAages);
for
var userAages = [19,21,18,34,32,25,45];//[20,22,19...]
var newarr=[];
for(var i=0;i<userAages.length;i++){
newarr.push(userAages[i]+1)
}
console.log(newarr);
forEach()
var userAages = [19,21,18,34,32,25,45];//[20,22,19...]
var newarrA=[];
userAages.forEach(item=>{
newarrA.push(item+1)
})
console.log(newarrA);
for-in
var userAages = [19,21,18,34,32,25,45];//[20,22,19...]
var newarr=[];
for(var key in userAages){
newarr.push(userAages[key]+1)
}
console.log(newarr);