一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情。
前言
提起数组大家应该都很熟悉,不论c++、java、php还是js,它们的数据类型都有数组,并且数组的属性都差不多。js中除了数组这一数据结构外还有一种数据结构是伪数组,下面就来看一下数组和伪数组有什么区别与相同点。
数组和伪数组的相同点
- 数组和伪数组都都可以通过length来获取长度
- 数组和伪数组都可以通过中括号加名字来进行读写操作
- 数组和伪数组都可以进行for循环的遍历
虽然伪数组和数组看起来很像,但伪数组不能调用数组的方法,比如slice、join等方法。
js中最常见的伪数组
提起js中的伪数组就不得不提到arguments了,这个东西在js中还是很常见的,它存在与函数体中,它主要包含函数的参数和一些其它的属性。如下代码:
function dog(age,name){
console.log(arguments)
}
dog(3,'小白')
结果如下图:
这里的length就表示了函数中实参的长度。
arguments的特点:当传入的有实参时,通过arguments[index]修改某个值,实参也会跟着改变,但如果没有传入实参则不会有这种情况
argumets有时候可以用来传递函数的参数,比如手写call和apply的时候都会用到,如下代码:
Function.prototype.myCall = function(context){ context.fn = this;
var args = [];
for(var i = 1, len = arguments.length; i < len; i++) { args.push('arguments[' + i + ']');
}
eval('context.fn(' + args +')');
delete context.fn;
}
对手写call有兴趣的可以点击查看
有时候我们可能需要将伪数组转换成数组,这时候es6给我们提供了非常方便的方法,那就是es6中的展开运算符,如下代码:
function test(a,b,c){
let arr = [...arguments]
console.log(arr.join()) //这里之所以这样是因为只有数组才能使用join()方法
}
test(1,2,3)
结果如下:
总结
js中的伪数组说常用也常用,说不常用也不常用,在日常的开发工作中对我来讲是不常用到的,但在我最近学习的手写call和apply中都有所使用,除了这些场景,只要是函数的参数不定长的情况基本都会用到arguments,函数的柯里化也会用到arguments。