类数组对象

  1. 定义:

    1. 可以通过索引属性访问元素并且拥有length属性对象
  2. 示例:

    1. var arrLike = {
    2. 0: 'name',
    3. 1: 'age',
    4. 2: 'job',
    5. length: 3
    6. }
  3. 为什么叫「类数组」:

    1. 访问赋值获取长度上的操作与数组是一致的


  1. 区别:
    1. 类数组不能直接使用数组的方法,会报错


  1. 类数组如何调用数组的方法:
    1. Array.prototype.push.call
    2. Array.prototype.push.apply

类数组对象 -> 数组对象

终于到了题目的内容,类数组对象 -> 数组对象的方法大概可以分为4类:

1. 使用生成新数组的数组操作方式:slice/splice/concat

原理很简单,通过对类数组进行操作,获取到生成的新数组,比如slice从0开始,这其中又分为:

  • 不改变原类数组:
    • Array.prototype.slice
    • Array.prototype.concat(只能使用apply)
  • 原类数组清空:
    • Array.prototype.splice ```javascript // call Array.prototype.slice.call(arrLike, 0); // 不改变原类数组 Array.prototype.splice.call(arrLike, 0); // 原类数组清空

// apply Array.prototype.slice.apply(arrLike, [0]); // 不改变原类数组 Array.prototype.splice.apply(arrLike, [0]); // 原类数组清空 Array.prototype.concat.apply([], arrLike);

  1. <a name="35nzN"></a>
  2. #### 2. 使用 Array.from (ES6)
  3. 到了es6,问题就更简单了,Array 提供静态方法 from 专门用于「从一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。」,只要对类数组对象操作一下就行了。
  4. ```javascript
  5. Array.from(arrLike)

3. 直接遍历对象赋值

不把类数组对象当成数组,而是当成一个普通对象来处理。

  1. var a = Object.keys(arrLike)
  2. .map(key => key !== 'length' ? arrLike[key] : null)
  3. .filter(val => !!val)

4. (arguments专用) 使用扩展运算符

与普通的类数组不同,arguments可以通过扩展运算符…来转换成数组,这可能是因为他Symbol(Symbol.iterator) 的属性进行遍历。

  1. function func(...arguments) {
  2. console.log(arguments); // [1, 2, 3]
  3. }
  4. func(1, 2, 3);