文章目录
前言
写本《JavaScript简餐》系列文章的目的是记录在阅读学习《JavaScript高级程序设计(第4版)》一书时出现的各个知识点。虽是对读书的笔记和总结,但是希望它轻量、简洁、犀利,不会引起阅读疲劳,可以在碎片化时间和闲暇之余轻巧地沐浴一下知识点。每篇文章只针对一个小部分进行讲解式的梳理,来达到个人复习总结和分享知识的目的。
一、理解参数
JavaScript中的参数和大多数其他语言都不太一样。函数既不关心传入的参数个数,也不关心这些参数的数据类型。比如你定义函数时要接收一个参数,这并不意味者调用时就得传一个参数。你传一个、两个、三个参数都可以,是不会报错的。之所以会这样,主要是因为ECMAScript函数的参数在内部表现为一个数组。函数被调用时总会接收一个数组,但函数并不关心这个数组中包含什么。如果数组中什么也没有或者数组元素数量超出了函数所要求的参数个数,这都没有问题。当我们在使用function关键字定义函数时,可以在函数内部访问arguments对象,从中取得传进来的每个参数值。 arguments对象是一个类数组对象(但不是Array的实例),因此可以使用中括号语法访问其中的元素。比如第一个参数就是arguments[0],第二个参数就是arguments[1]。而要确定传进来多少个参数可以访问arguments.length属性。话不多说,直接上代码:function add(x, y) {
console.log(`一共传进来${
arguments.length}个参数哦。`); // 一共传进来2个参数哦。
return arguments[0] + arguments[1];
}
console.log(add(2, 3)); // 5
这里的arguments[0]和arguments[1]就对应着函数参数中指定的x和y。调用函数时传了2和3两个参数,我们也可以看到arguments.length确实是2。 那这时候我们可能会突然有个大胆的想法,我不在function后面的括号里写形参了可不可以???当然可以!来看一下:
function sub() {
return arguments[0] - arguments[1];
}
console.log(sub(5, 3)); // 2
可见,依然可以拿到参数来进行运算。这就表明,ECMAScript函数的参数只是为了方便才写出来的,并不是必须写出来的。与其他语言不同,在ECMAScript中的形式参数不会创建让之后的调用必须匹配的函数签名。这是因为根本不存在验证形式参数的机制。 arguments对象另一个有意思的地方就是,它的值始终会与对应的形参同步。来看下面的例子: