array.slice的类里为什么不能这么用
发布于 10 年前 作者 wdvill 4540 次浏览 最后一次编辑是 6 年前
    var invokeCb = function(cb) {
        console.log( arguments.slice(1));
        console.log( Array.prototype.slice.call(arguments, 1));
}

invokeCb('aa','bb','cc','dd');

为什么 console.log( arguments.slice(1)); 这句是错误 而 console.log( Array.prototype.slice.call(arguments, 1)); 而这句是正常的

求解

2 回复

给你讲的详细点,好理解~ 函数的 arguments 对象并不是一个数组,类似数组具有数字索引和length。只有真正的数组对象才slice方法。 那么通过Array.prototype.slice.call调用,把arguments对象转化为真正的Array对象。 类似下面代码功能 var args = []; for (var i = 1; i < arguments.length; i++) { args.push(arguments[i]); } 一般情况下面2种方法都能实现arguments转数组 var args = Array.prototype.slice.call(arguments); var args = [].slice.call(arguments, 1); 一般情况下arguments.length较小时用var args = [].slice.call(arguments, 1); 性能比较好。 当arguments.length比较大时var args = Array.prototype.slice.call(arguments);性能好。

很好很详细。想了解一下。两个转数组的方式的性能是怎么衡量出来的?我一直以为 [].slice和Array.prototype.slice都是取得同一个function对象,[]是多了一层创建新数组的动作。Array.prototype多了一层对象链搜索。理解布了arguments.length大时,后者的优势在哪。

回到顶部