📕 重学JavaScript:函数的入参(arguments)是什么类型?我能怎么使用它?

简介: arguments是一个特殊的对象👏,它可以存储我们给函数传递的所有参数。只不过它的属性从0开始排,依次为0,1,2…最后还有callee和length属性。我们也把这样的对象称为类数组。

📕 重学JavaScript:函数的入参(arguments)是什么类型?我能怎么使用它?

嗨,大家好!这里是道长王jj~ 🎩🧙‍♂️

平时我们写代码的时候,有没有想到过这样的问题:🤔

  1. 类似于func01(num, name){} 中的 num, name 到底是什么类型的呢?它有可能是一个数组在函数中运行吗?
  2. 我们搞懂它有什么意义?

其实,这两个问题都和arguments有关。arguments是一个特殊的对象👏,它可以存储我们给函数传递的所有参数。只不过它的属性从0开始排,依次为0,1,2…最后还有callee和length属性。我们也把这样的对象称为类数组。

arguments可以让我们在函数里面访问这些参数,不管有多少个,也不管有没有名字。arguments就像一个收纳盒,可以装下所有的参数📦

常见的类数组还有:

  • getElementByTagName 获得的 HTMLCollection
  • querySlector获得的nodeList

它们和数组长得很像,但是不能用数组的方法,比如push或pop。类数组就像一个假冒的数组,长得像但是不能用数组的方法😅

所以,它和数组的性质是完全不一样的呢❗️

❓ 既然不是数组,那我怎么样去操作它呢?

既然是类数组,那我们只要把它们转化成数组格式,即可使用操作数组的技巧使用它们了!

如果用这种思路的话,那就好办了,其实有几种常见的方法可以转化这种类数组对象。

方法一:Array.prototype.slice.call()

利用slice方法可以从一个类数组对象中返回一个新的数组。我们只需要把类数组对象作为call方法的第一个参数传入,就可以得到一个真正的数组。

function sum(a, b) {
   
  let args = Array.prototype.slice.call(arguments);
  console.log(args.reduce((sum, cur) => sum + cur));//args可以调用数组原生的方法啦
}
sum(1, 2);//3

方法二:Array.from()

这个方法是ES6新增的一个方法,它可以把一个类数组对象或者可迭代对象转换成一个新的数组。我们只需要把类数组对象作为参数传入,就可以得到一个真正的数组。

function sum(a, b) {
   
  let args = Array.from(arguments);
  console.log(args.reduce((sum, cur) => sum + cur));//args可以调用数组原生的方法啦
}
sum(1, 2);//3

这种方法也可以用来转换Set和Map哦!👏

方法三:ES6展开运算符

这个方法也是ES6新增的一个语法糖,它可以把一个类数组对象或者可迭代对象展开成一个新的数组。我们只需要在类数组对象前面加上三个点(…),就可以得到一个真正的数组。看看下面的例子:

function sum(a, b) {
   
  let args = [...arguments];
  console.log(args.reduce((sum, cur) => sum + cur));//args可以调用数组原生的方法啦
}
sum(1, 2);//3

展开运算符不仅可以用在函数参数里,还可以用在其他地方,比如合并两个数组或者复制一个数组。😎

方法四:利用concat+apply

利用concat方法可以把两个数组拼接成一个新的数组,和apply方法可以把第二个参数展开,就像把一个鸡蛋打碎一样🥚。我们只需要把一个空数组和类数组对象作为apply方法的参数传入,就可以得到一个真正的数组。看看下面的例子:

function sum(a, b) {
   
  let args = Array.prototype.concat.apply([], arguments);//apply方法会把第二个参数展开
  console.log(args.reduce((sum, cur) => sum + cur));//args可以调用数组原生的方法啦
}
sum(1, 2);//3

方法五:直接暴力循环

最原始的方法就是再创建一个数组,用for循环把类数组的每个属性值放在里面,过于简单,就不浪费篇幅了😜


🎉 你觉得怎么样?这篇文章可以给你带来帮助吗?如果你有任何疑问或者想进一步讨论相关话题,请随时发表评论分享您的想法,让其他人从中受益。🚀✨

目录
相关文章
|
16天前
|
JavaScript
变量和函数提升(js的问题)
变量和函数提升(js的问题)
|
16天前
|
JavaScript
常见函数的4种类型(js的问题)
常见函数的4种类型(js的问题)
10 0
|
17天前
|
JavaScript
写一个函数将N组<>(包含开始和结束),进行组合,并输出组合结果 (js)
写一个函数将N组<>(包含开始和结束),进行组合,并输出组合结果 (js)
9 0
|
28天前
|
自然语言处理 JavaScript 网络架构
js开发:请解释什么是ES6的箭头函数,以及它与传统函数的区别。
ES6的箭头函数以`=>`定义,简化了函数写法,具有简洁语法和词法作用域的`this`。它无`arguments`对象,不能用作构造函数,不支持`Generator`,且不改变`this`、`super`、`new.target`绑定。适用于简短表达式,常用于异步编程和高阶函数。
17 5
|
1月前
|
JSON JavaScript 前端开发
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
33 0
|
18天前
|
JavaScript 前端开发
JavaScript 中如何检测一个变量是一个 String 类型?
JavaScript 中如何检测一个变量是一个 String 类型?
21 2
|
3天前
|
缓存 JavaScript 前端开发
js的入口函数,入口函数的作用
js的入口函数,入口函数的作用
12 4
|
16天前
|
JavaScript 前端开发
JavaScript数组的功能内置类型
数组是JavaScript的内置类型,JavaScript数组的功能特别强大。下面简单介绍一下JavaScript数组。
|
18天前
|
存储 前端开发 JavaScript
JavaScript如何封装一些常见的函数来提高工作效率
通过封装这些常见函数,你可以在项目中重复使用,提高代码的复用性和工作效率。这些函数包括获取元素、发起Ajax请求、处理本地存储、日期格式化、定时器等功能,可以在不同场景中减少重复的代码编写。
7 0
JavaScript如何封装一些常见的函数来提高工作效率
|
18天前
|
存储 JavaScript 前端开发
JavaScript 中松散类型的理解
JavaScript 中松散类型的理解
25 3