2022/1/8号
一、JavaScript
(1)函数初始化参数
(参数默认值的问题)
参数的默认值,如果你不设置,就是undefined
function test(a,b){
console.log(a);//1
console.log(b);//undefined
}
test(1);
function test(a = 1,b){
console.log(a);//1
console.log(b);//undefined
}
test();
注意:
1.如果在实参给a赋值2,形参给a赋值1
function test(a=1){
console.log(a);//2
}
test(2);
2.如果给a实参赋值undefined,形参赋值1
function test(a=1,b){
console.log(a);//1
console.log(b);//2
}
test(undefined,2);
相反,如果给a实参赋值1,形参赋值undefined
function test(a=undefined,b){
console.log(a);//1
console.log(b);//2
}
test(1,2);
总结:
如果arguments[0]
(实参)是undefined; a
(形参)是 1;那么就选择形参上的默认值。
相反如果arguments[0]
是1; a 是 undefined ,则选择实参上的默认值。
即:是不是undefined,就选谁的值 ,这也是映射关系
注意:
这种给形参赋值的做法,是不兼容的。function test(a = 1,b = 2)
这是es6的写法,这是2015这个版本新增的一个特性,es5是不可以这么写的。
方法一:曲线救国(写法简单)
function test(a,b){
var a =arguments[0]||1;//如果不存在返回1
var b =arguments[1]||2;//如果不存在返回2
console.log(a+b);//3
}
test();
如果实参存在值,则返回该值
function test(a,b){
var a =arguments[0]||1;//如果不存在返回1
var b =arguments[1]||2;//如果不存在返回2
console.log(a+b);//7
}
test(3,4);
方法二:typeof(推荐这么写)
**注:**typeof打印出来的都是字符串
function test(a,b){
// var a =arguments[0]||1;//如果不存在返回1
// var b =arguments[1]||2;//如果不存在返回2
if(typeof(arguments[0])!=='undefined'){
a = arguments[0];
}else{
a = 1;
}
if(typeof(arguments[1])!=='undefined'){
b=arguments[1];
}else{
b=2
}
console.log(a+b);//3
}
test();//test(3,4)时,输出7
另一种写法:
三元运算符
function test(a,b){
var a =typeof(arguments[0])!=='undefined'?arguments[0]:1;//?代表如果条件成立,就赋值arguments[0],如果不成立就复制1
var b =typeof(arguments[1])!=='undefined'?arguments[1]:2;
console.log(a+b);
}
test();
(2)作业
1、n的阶乘,不能用 for循环
方法:递归(函数自己调用自己)
分析:
规律:n!=n*(n-1)!
出口:如果没有出口,上面会无限循环下去
var n=prompt('请输入数字');
function test(n){
if(n==1){ //出口
return 1;//当n到1是,返回1
}
return n * test(n-1);
}
console.log(test(n));
用递归解决方法,首先,要把规律找到,然后找到一个出口