一些类数组,比如函数中的实际参数arguments对象,虽然与数组形似,但还不是一个真正的数组,有时候需要将其变成一个真正的数组。

现在可以用slice方法可以将arguments对象转化为一个真正的数组:

var args = Array.prototype.slice.call(arguments, 0);

这也是jQuery中使用到的方法。

除此之外,也可以直接创建一个新数组来调用其slice方法实现:

var args = [].slice.call(arguments, 0);

但这种方法经过测试效率并没有上面的方法高。

除了上面两种方法之外,也可以直接循环arguments对象,赋值到新的数组中:

var args = [];  
for (var i = 0, length = arguments.length; i < length; i++) {  
    args.push(arguments[i]);
}

通常都是没有最优的方法,只有最合适的方法,大部分情况下,用第一种方法就可以实现对象到数组的转化,可是NodeList(比如:document.getElementsByTagName("div"))在IE中就不能使用第一种办法将其转化为数组,因为在JavaScript中,一个Dom NodeList并非一个JavaScript对象,在IE中再使用var args = Array.prototype.slice.call(nodes, 0);就会抛错,这时就需要用最原始的办法解决:

function nodeListToArray(nodes) {  
    var arr;

    try {
        // works in every browser except IE
        arr = [].slice.call(nodes);
        return arr;
    } catch (err) {
        // slower, but works in IE
        arr = [];

        for (var i = 0, length = nodes.length; i < length; i++) {
            arr.push(nodes[i]);
        }
        return arr;
    }
}