类数组对象和数组有什么不一样?
都可以:
likeArray[0]去读
likeArray[0] = "123"去写
都可以likeArray.length
都可以for循环
但是,likeArray.push()会报错如何让likeArray可以使用数组的方法呢?间接调用\
likeArray = { 0: 'name', 1: 'age', 2: 'sex', length: 3 }
// likeArray.push(1) 这样调用不成功,说明liskeArray不是Arrray的实例
思考:为什么我们直接声明一个数组 var arr = [],然后就可以调用那些数组的方法呢 比如 arr.push arr.slice等等
其实这个可以结合js的装箱去理解 调用push slice这些方法,本质其实是在调用Array.prototype里面的方法,如何让不是Array的实例也调用Array.prototype里面的方法呢?
数组.push 这样的方式去调用,其实就是通过一层层的原型链去找到Array.prototype里面的push方法,所以数组.的方式就可以调用push
但类数组对象不是Array的实例,所以,它就没有办法通过点的方式去找Array的原型链.
你学过call,它有什么作用呢? 可以调用函数,第一个参数是让调用的这个函数的this指向的目标对象,其后的参数就是函数的参数,arr.push 这样调用push这个函数的时候,push里面的this是指向arr的,是不是,为什么呢?谁调用它就指向谁嘛,比如:
在全局作用下,this是指向window的,我们在全局作用域下声明的变量 var a = 1,拿a的时候可以直接拿就行了,但也可以this.a去拿。
调用函数也是,比如函数 function fn(){} 在全局作用域下,我们可以直接调用 fn(),但也可以this.fn()去调用。
fn函数里面的this就是指向window嘛,谁调用我就指向谁,在全局作用域下,其实就是全局对象window调用的fn 即 this.fn。
又因为 arr.push(),因为push是arr调用的嘛,所以 push函数里面的this就指向于arr
因为call可以改变this指向
所以 直接调用
//这个时候,就是likeArray调用push,因为此时push的this指向likeArray
Array.prototype.push.call(likeArray,1)
console.log(likeArray);//{0: 'name', 1: 'age', 2: 'sex', 3: 1, length: 4}
其他的例子
var likeArray = {0: 'name', 1: 'age', 2: 'sex', length: 3 }
// 可以把类数组对象转换为真正数组的方法
Array.prototype.slice.call(likeArray); // ["name", "age", "sex"]
Array.prototype.splice.call(likeArray, 0); // ["name", "age", "sex"]
Array.from(likeArray); // ["name", "age", "sex"]
Array.prototype.concat.apply([], likeArray)
Arguments对象
function test(name, age, sex) {
//函数里面的arguments,其实就是Arguments 对象
console.log(arguments);
}
test('name', 'age', 'sex')