「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」
前言
“人的生活注定要受苦,但我们必须要找快乐,哪怕只是电光火石,因为快乐是照在沉沉大地上的寥落的星辰。”大家都开始上班了吗?上班的时候想下班,你们也会这样吗?今天学习总结了ECMAScript函数的参数相关的知识。
理解参数
ECMAScript函数的参数和其它语言不同,它既不关心传入的参数的个数,也不关心它们的数据类型。而且定义函数时要接收几个,实际传几个都不会报错。
之所以会这样是因为,ECMAScript函数的参数在内部表现为一个数组,在使用function关键字定义(非箭头)函数时,可以在函数内部访问到arguments对象:它是一个类数组对象,但是不是Array的实例,可以用中括号语法访问其中的元素,第一个参数是arguments[0],可以用arguments.length属性来确定穿传入的参数个数。例如:
function sayHi(name,message){
console.log("Hello " + name + ", " + message);
}
上述写法等同于:
function sayHi(name,message){
console.log("Hello " + arguments[0] + ", " + message);
}
如何知道传入参数个数,例如:
function howManyArgs{
console.log(arguments.length);
}
howManyArgs();//输出 0
howManyArgs(2);//输出 1
howManyArgs("string", 88);//输出 2
也就意味着开发的时候相传多少参数都行,还有一个点就是arguments对象可以跟命名参数一起使用,例如:
function doAdd(num1,num2){
if(arguments.length === 1){
console.log(num1 + 1);
}else{
console.log(arguments[0] + num2);
}
}
在这个函数中,一起用了命名参数和arguments对象,它们的值是一样的,所以使用任何一个都可以。但是虽然arguments对象会自动同步对应的命名参数,即修改arguments对象的值相应的命名参数的值会被改变,反过来是不会影响的。
如果函数是使用箭头语法定义的,那么传入的参数只能通过定义的命名参数访问,使用arguments关键字会报错:ReferenceError:arguments is not defined
总结
平时一直没注意这个小知识点,在定义函数以及传递参数时都是对应的,所以也没见到过这类错误。今天学过之后才知道原来是这样的。但是经验来看还是规范一些比较好!