1、【函数的定义】
1.1、JavaScript 使用关键字 function 定义函数。函数可以通过声明定义,也可以是一个表达式。
1.2【函数的作用】
实现特定功能的代码,可复用。
1.3【函数的封装】
即把可以实现一定功能的代码,封装成一个函数。
1.4【函数的好处】
1、提高开发效率
2、复用,减少代码量
3、开发、维护、更灵活,把功能分开来写,团队开发效率高
4、参数、返回值,让函数更灵活
1.4.【函数的三要素】
1. 函数名
2. 返回值return
注:函数100%有返回值。
注: 若写了,则返回return后的内容。若没写return则返回undefined
注:return具备终止函数的功能。若需要返回多个值,需要return后面的内容是引用数据类型。
3.参数
1、形参(形式参数)
在函数声明的时候
2、实参(实际参数)
在调用函数的时候
注:形参的个数比实参多,多的形参数为undefined。实参的个数比形参多,多的实参数不会使用。
2、【函数的声明】
2.1字面量声明function F70 () {函数体}
2.2构造函数声明let F70 = new Function();
3【调用函数(执行函数体)】
书写格式:函数名 小括号
// 函数会不会执行不代表调用,执不执行取决于函数是否被调用
function serach() {
console.log(`您的当余额为1000`);
}
// 调用函数,此时才能执行{}中的console.log(`您的当余额为1000`)
serach();
4、【匿名函数】
//函数表达式(匿名函数表达式)
let F70 = function F71() {
console.log(`asdadasd`);
}
F70();//asdadasd
F71();//F71 is not defined
console.log(F70.name);//F71 (F70的名字是F71,但是调用的时候不能使用F71(),还是必须使用F70()调用,否则会报错F71 is not defined)
5、【类数组】
函数名.arguments
arguments是函数的属性,返回所有的实参内容
可以类似于数组的使用方式进行值的获取
注:
1、形参和实参都写在{}中
2、形参与实参一一对应
3、以形参接收为主,新参与实参可以同名,不能以name 与name 对比接收
4、函数的调用,在函数调用的时候是实参
let inputName = "YY"
let inputAge = 18;
let inputGender = "男"
let hobby=1234
let num=1000
arr(inputName, inputAge, inputGender,hobby,num);
function arr(name, age, gender, hobby) {
//arr函数的声明,在函数声明的时候是形参。
console.log(`你好
我叫${name}
今年${age}
我是${gender}生
我的爱好是${hobby}
`);
//输出所有实参内容
console.log(arr.arguments);
console.log(arr.arguments[arr.arguments.length-1]);
// 输出所有实参的个数
console.log(arr.arguments.length);//5
//函数名.length 输出的是形参的个数
console.log(arr.length);//4
};
6、【不定参数 ...形参】
注:
1、接受多的实参内容(以数组形式)
2、只能写在最后一个形参位置(其他位置,会报错)
function arr1(a, b, ...c) {
console.log(a, b, c);
console.log(arr1.length); //2
}
arr1(1, 2, 3, 4, 5, 6);//1 2 [ 3, 4, 5, 6 ]
function arr2(a, ...b,c) {
console.log(a, b, c);
console.log(arr2.length);
}
arr2(1, 2, 3, 4, 5, 6);//报错(Rest parameter must be last formal parameter)
7、【箭头函数】
1、省略function关键字
2、如果只有一个形参,可以省略小括号
3、如果函数体只有一条语句,可以省略打括号
4、如果函数体只有一条语句,并且需要返回这条语句的结果。
则可以省略return关键字
5、不可以使用arguments
6、不会把自己的this绑定到函数上
7、不可以用作构造函数
let arr1 = a => a + 1;
let arr2 = arr1(100);
console.log(arr2);//101
let arr3 = (a, b, ...c) => {
let f00 = a + b;
return f00;
}
console.log(arr3(1, 2)); //3
8、【回调函数】
当一个函数A,提供给函数B当参数,则A就是回调函数
function a(temp) {
console.log("F70");
temp();
}
function b() {
console.log("F71");
}
a(b);//F70与F71都会输出
9、【数组的排序】
9.1升序与降序
let arr3 = [1, 30, 5, 11, 8, 50];
// 升序
let arr1 = arr3.sort((a, b) => a - b);
console.log(arr1);//[ 1, 5, 8, 11, 30, 50 ]
// 降序
let arr2 = arr3.sort((a, b) => b - a);
console.log(arr2);//[ 50, 30, 11, 8, 5, 1 ]
10、【数组的方法every】
类似于"与",一假全假。
判断数组中的每个值,是不是都满足需求
注:所有都满足返回true,有1个不满足,则返回false
let arr = [1, 30, 5, 11, 8, 50];
let state = arr.every(a => a % 2 == 0);
console.log(state); //false
11、【数组的方法some】
类似于"或",一真全真。
判断数组中的每个值,是不是都满足需求
注:只要有1个满足,就返回true,都不满足才会返回false
let arr = [1, 30, 5, 11, 8, 50];
state = arr.some(a => a % 2 == 0);
console.log(state); //true
12、【数组的方法filter】
过滤。
返回满足条件的值
let arr = [1, 30, 5, 11, 8, 50];
let state = arr.filter(a => a % 2 == 0);
console.log(state); //[30,8,50]
13、【数组的方法map】
遍历数组中的每个值,执行箭头函数的操作,并把最终结果,已数组的方式返回。
(有返回值)。
注:不会改变原数组。
let arr = [1, 30, 5, 11, 8, 50];
let state = arr.map(a => a % 2 == 0);//[ false, true, false, false, true, true ]
let state = arr.map(a => a-1);//[ 0, 29, 4, 10, 7, 49 ]
console.log(state);
14、【数组的方法forEach】
遍历数组中的每个值,执行箭头函数的操作,并把最终结果.
(无返回值)
注:不会改变原数组,不能使用break
let arr = [1, 30, 5, 11, 8, 50];
let state = arr.forEach(a => a-1);
console.log(state);//undefined(说明无返回值);
arr.forEach(a => { console.log(a - 1); });//0
//29
//4
//10
//7
//49
15、【立即执行函数】
创建即调用,调用即销毁
适用场景:关于一次性变量(时间)
(function F70() {
console.log("F70");
})();
16、【交集、并集、差集】
16.1交集
let arr1 = [1, 2, 3];
let arr2 = [2, 3, 4];
let intersect = arr1.filter(a => arr2.includes(a));
console.log(intersect);//[2,3]
16.2并集
let arr1 = [1, 2, 3];
let arr2 = [2, 3, 4];
let union=new Set([...arr1,...arr2]);
console.log([...union]);//[1,2,3,4]
16.3差集
let arr1 = [1, 2, 3];
let arr2 = [2, 3, 4];
let difference = arr2.filter(a => !arr1.includes(a));
console.log(difference);//4