📕 重学JavaScript:怎么处理arguments这种伪数组?

简介: 平时我们写代码的时候,有没有想到过这样的问题:类似于func01(num, name){} 中的 num, name 到底是什么类型的呢?我们该怎么处理它呢?

嗨,大家好!这里是道长王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循环把类数组的每个属性值放在里面,过于简单,就不浪费篇幅了😜


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

目录
相关文章
|
7天前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
19 3
|
20天前
|
存储 JavaScript 索引
JS中数组的相关方法介绍
JS中数组的相关方法介绍
|
20天前
|
JavaScript Java
JS有趣的灵魂 清空数组
JS有趣的灵魂 清空数组
|
2月前
|
JavaScript 前端开发 API
常用JavaScript 数组 API大全
常用JavaScript 数组 API大全
32 0
|
2月前
|
存储 JavaScript 前端开发
在JavaScript中,对象和数组是如何进行扩展的?
在JavaScript中,对象和数组是如何进行扩展的?
22 4
|
2月前
|
JavaScript
JS数组增删方法的原理,使用原型定义
JS数组增删方法的原理,使用原型定义
|
1天前
|
JavaScript 前端开发 索引
JavaScript 数组的索引方法数组转换为字符串方法
JavaScript 数组的索引方法数组转换为字符串方法
|
5天前
|
JavaScript 前端开发
js 操作数组的方法
js 操作数组的方法
15 4
|
13天前
|
JavaScript 前端开发 索引
JavaScript 数组中的增、删、改、查
JavaScript 数组中的增、删、改、查
|
15天前
|
JavaScript 前端开发 索引
在JavaScript中,可以使用数组字面量或Array构造函数来创建一个数组对象
【4月更文挑战第16天】在JavaScript中,可以使用数组字面量或Array构造函数来创建一个数组对象
23 4