嗨,大家好!这里是道长王jj
~ 🎩🧙♂️
平时我们写代码的时候,有没有想到过这样的问题:🤔
- 类似于
func01(num, name){}
中的num, name
到底是什么类型的呢?它有可能是一个数组在函数中运行吗? - 我们搞懂它有什么意义?
其实,这两个问题都和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循环把类数组的每个属性值放在里面,过于简单,就不浪费篇幅了😜
🎉 你觉得怎么样?这篇文章可以给你带来帮助吗?如果你有任何疑问或者想进一步讨论相关话题,请随时发表评论分享您的想法,让其他人从中受益。🚀✨