一、什么是伪数组?
简单来说就是用对象的key=value方式存储数组的内容,属性为index索引。外加一个length的属性,值为最大index+1
1. 在JS当中arguments是最常接触的伪数组,在ES6之前可以通过遍历它转成真数组
2. ES6后可以用过…的方式把伪数组数据拿出来push到数组当中
3. 既然push是遍历添加的方式往数组里面添加元素,也就是说…里面是每一个伪数组的元素集合,底层应该是通过遍历添加到数组当中==(纯个人观点,不对勿喷)==
现在还没有搞懂为什么中间会有空格??
二、通过[].push.apply()的方式把真数组转变为伪数组,同时也能把为伪数组变为真数组
这里可能存在一些疑惑为什么会这样,接下来讲解一下apply和call方法。
1. apply 和 call
众所周知在js当中函数内部打印this值是调用这本身,就是谁调用的this值指向的就是谁,要想改变this的值有3种方式 call(),apply(),bind(), 简单说说3者之间的区别,call,apply会直接调用函数,bind不会。bind还需要在调用,多数情况下配合定时器使用。接下来我只分析apply和call方法,想要了解bind可以自行百度
call和apply 两者存在大部分相似之处,调用方法也一样,都是 拥有该函数对象的名字.函数名.call(x,y)/apply(x,y) 传入的第一个参数x就是你想要改变的函数里面原本的this值,y就是传入的实参
可以看到call和apply都可以改变this的值,接下来我们通过可传入的参数和代码看看他们之间有何区别?
可以看到call方法从第二个参数开始传入,实参和形参一 一对应。接下来看apply
好像只有第一个数组的值可以传进去,分别赋值给了a,b。
把1,2的[]去掉直接报错,显而易见,apply方法只能接受两个参数,第一个是想要改变this的值,第二个是个数组对象。
一点问题的没有。总结apply会将传入的数组中的元素一次取出,传递给形参。
最后,还是那句话好的东西一般都有兼容性问题,在IE8以下[].push.apply()将自定义伪数组转变成数组会报错,接下来写通用的方法slice。
slice(indexStart,indexEnd)在数组当中是切割数组返回一个新的数组,原数组的不会被改变。第一个参数indexStart,从索引位置开始(包括)。第二个indexEnd,结束索引的位置(不包括)。[indexStart,indexEnd) 大于等于indexStart,小于indexEnd。只传入第一个参数的话,默认到末尾。
从原数索引为4的地方(也就是值为5)【包括它本身】开始到末尾 。
这很好理解,就是从原数索引为4的地方(也就是值为5)【包括它本身】开始到索引为6(也就是值为6的位置)【不包括它本身】 。
重点高潮来了!
如果什么都不传的话,他会遍历原数组返回一个新的数组给你。所以也可以通过它来遍历数组或伪数组
apply和call一样,因为没有传递第二个参数。为什么可以这样,因为第一张图 a.slice() 也就是他本是this.slice()。call/apply调用就等于 Person.slice()遍历它本身 返回一个新的数组。所以在开发当中可以先把全部的伪数组通过这个方法变成了真数组后在进行对应的操作。
三 记录下
可以通过这种方式嫁接其他对象的任何方法。
四. 回调函数里面的this值
想要改变回调函数的this值,需要在内部使用call或者apply方法调用,同理想要改变普通函数的this值,在外部调用call和apply,即可