JavaScript怎么让类数组使用上数组的方法?
什么是类数组?
- JavaScript 常见的类数组:arguments
- JavaScript 常见的类数组:获取Dom元素方法返回的结果(比如getElementsByTagName)
- 类数组和数组的区别与联系
数组用有丰富的内建方法供大家使用,而类数组是结构与数组十分相似(类数组相当于一个对象,key是数字,或者数字的字符串形式,并且拥有length属性)但是却没有数组那么丰富的内建方法,通常类数组可能还拥有一些别的属性。
类数组的组成
-
类数组是一个对象
-
类数组这个对象必须包含length属性
-
类数组中key是以数字或者数字的字符串组成。
类数组的定义
var arrLike = {0:"zhangsna",1:"lisi",2:"wangwu",3:"zhaoliu",4:"xiaoming",5:"xiaohong",length:6}
console.log(arrLike)
console.log("甚至可以像数组一样使用for循环")
for (let i = 0;i<arrLike.length;i++){
console.log(i+":",arrLike[i])
}
数组丰富的内建方法有哪些?
- 控制台打印输出看下
如何让类数组使用上数组丰富的内建方法?
- 调出数组的方法
- 运用call或者apply显示绑定this的指向
例如我想通过filter方法过滤出类数组中元素包含"i"这个字符的所有元素。
可以通过如下写法进行处理。
[].filter.call(arrLike,(item)=>{return item.includes("i")})
如果你想进一步的了解为什么可以这么做,其实可以想想filter是如何实现的。
//myFilter
[].__proto__.myfilter = function (callback) {
let newArr = []
for (let i = 0;i<this.length;i++){
if (callback(this[i])){
newArr.push(this[i])
}
}
return newArr
}
for (let i = 0;i<arrLike.length;i++){
console.log(i+":",arrLike[i])
}
console.log(
[].myfilter.call(arrLike, (item) => {
return item.includes("i")
}));
可以看出就是因为filter实现是通过this进行绑定的,哪个数组调用了这个filter,filter中的this就指向哪个数组。看到这里你脑海里是否有一个闭环?