怎么理解类数组对象
javascript有个很特别的东西,类数组。什么是类数组呢,应该都听说过js函数中的arguments,除了这个还有很多很多。
比如说:string就是个类数组,你可以取string[3]获得第四个字符,也可以string.length
DOM元素的childNodes,用querySelectorAll选中的全部元素,还有jQeury也是很经典的类数组对象。
为什么他们是呢,因为他们都是对象,没有继承Array,但是他们有0,1,2,3下标,也有length;
神奇。。。
在这我们造一个类数组玩玩。
var arr = [ 1 , 2 , 3 ] //制造一个数组 var arrCopy = {} //一个假的数组 for( var i = 0 ; i < arr.length ; i++ ){ arrCopy[i] = arr[i] //假数组获得了真数组的所有元素了 } arrCopy.length = arr.length ; //假数组还有长度 arrCopy.say = function(){ console.log(" i am not arr ") //假数组居然还有了say方法 }
console.log("下边这是真的arr")
console.log(arr)
console.log("下边这是arrCopy")
console.log(arrCopy)
上面我们构造了一个对象,这个对象居然有“下标”,本质上这个不是下标,字符串属性而已。他还有length,也是人造的而已啦。
那么这个类数组有什么意义呢
它获得了数组以下标为属性值的性质和length长度属性,更便捷的获取元素和操作,但是他不能使用array的任何方法。因为没有继承到。但是他有其他的方法,这是array所没有的。
类数组操作
好多人会觉得,好可惜呀,我的类数组对象不能map, forEach, every是一件多么难受的事情啊。
其实操作方法很简单利用call就可以了
[].map.call(arrCopy,function(elem,index){ return elem*elem })
同理其他的方法也一样
this指向问题,forEach map这些会把指向改变,他们有第二个参数this指向的是第二个参数;
类数组对象和数组的转化
var newArr = [].slice.call(arrCopy);
这样就可以返回一个新的数组和arrCopy一样,简单省事。