一、什么是类数组
对象类型的数据,key为数字,并且具有length属性
例如:
var obj = {
0: 'a',
1: 'b',
2: 'c',
length: 3
}
类数组的特点
- 类数组的key都是数字,所以通过obj[key]就可以获取到value
- 类数组是一个特殊的对象结构,有length属性,所以能进行for循环。并且类数组可以使用for of遍历(arguments、NodeList等类数组的原型上都实现了Symbol.iterator属性)
- 无法使用数组原型上的方法
二、常见的类数组
1、arguments,类型为[object Arguments]
function test() {
console.log(arguments)
}
test(1, 2, 3)
2、NodeList,类型为[object NodeList]
<ul>
<li>第一行</li>
<li>第二行</li>
<li>第三行</li>
<li>第四行</li>
</ul>
<script>
var lis = document.querySelectorAll('li')
console.log(lis)
</script>
3、HTMLCollection,类型为[object HTMLCollection]
var lis = document.getElementsByTagName('li')
console.log(lis)
4、字符串,类型为[object String]
var str = 'abc' // js引擎会自动为string类型加上包装类 var str = new String('abc')
三、类数组转数组的方法
类数组和数组在结构上很像,但是类数组的本质是一个对象,它的原型直接指向Object,所以无法使用数组的一系列方法;而数组的原型指向Array,可以使用Array.prototype上的一系列方法,这就是为什么要将类数组转为数组的原因。
1、借用ES5的slice
function test() {
const arr = Array.prototype.slice.call(arguments)
console.log(arr)
}
test(1, 2, 3)
2、ES6扩展运算符
[...arguments]
3、ES6静态方法Array.from
Array.from(arguments)