JS深入系列之类数组和数组之间的转换

1,761 阅读1分钟

类数组与数组的区别与转换


先来看一下数组不同于其他对象的一些特性

  • 有新元素加入的时候,会自动更新length属性
  • 可以通过设置length属性来对数组进行分割
  • 从Array.prototype中继承了有用的方法
  • 其类属性为Array

而类数组对象呢。其实就是指一些虽然不能直接调用数组方法,并且也不能对他们的length属性做出什么特殊行为,但是那些针对数组的代码依然能在他们的身上完美的发挥效用的对象,就像针对真正的数组运行一样。

在JS中 Arguments就是一个经典的类数组对象,某些DOM 方法的返回值也是(比如document.getElementsByTagName)

下面用一个函数来检测类数组

//判断o是否是一个类数组对象
//判断o是不是一个对象而不是什么其他的
//判断o有length属性,并且有限
//o.length是非负值且整数
//o.length小于2^32

function isArrayLike(o){
    if(o && typeof o == "object"
    && isFinite(o.length)
    && o.length>=0
    && o.length == Math.floor(o.length)
    && o.length < 4294967296){
        return true
    }
    return false
}

接下来是类数组和数组的转化

//类数组转化为数组:
Array.prototype.slice.call(arguments)
Array.prototype.slice.apply(arguments)
[].slice.call(arguments)
[].concat.apply([],arguments)
Array.from(arguments) // es6