类数组

69 阅读1分钟

一、什么是类数组

对象类型的数据,key为数字,并且具有length属性

例如:

      var obj = {
        0: 'a',
        1: 'b',
        2: 'c',
        length: 3
      }

类数组的特点

  1. 类数组的key都是数字,所以通过obj[key]就可以获取到value
  2. 类数组是一个特殊的对象结构,有length属性,所以能进行for循环。并且类数组可以使用for of遍历(arguments、NodeList等类数组的原型上都实现了Symbol.iterator属性)
  3. 无法使用数组原型上的方法

二、常见的类数组

1、arguments,类型为[object Arguments]

      function test() {
        console.log(arguments)
      }

      test(1, 2, 3)

image.png

2、NodeList,类型为[object NodeList]

    <ul>
      <li>第一行</li>
      <li>第二行</li>
      <li>第三行</li>
      <li>第四行</li>
    </ul>
    <script>
      var lis = document.querySelectorAll('li')
      console.log(lis)
    </script>

image.png

3、HTMLCollection,类型为[object HTMLCollection]

      var lis = document.getElementsByTagName('li')
      console.log(lis)

image.png

4、字符串,类型为[object String]

      var str = 'abc' // js引擎会自动为string类型加上包装类 var str = new String('abc')

image.png

三、类数组转数组的方法

类数组和数组在结构上很像,但是类数组的本质是一个对象,它的原型直接指向Object,所以无法使用数组的一系列方法;而数组的原型指向Array,可以使用Array.prototype上的一系列方法,这就是为什么要将类数组转为数组的原因。 image.png

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)