Array.prototype.slice.call(arguments, 1) 不就是等于 arguments.slice(1)?

这是jqFloat插件里的代码:

if (element.data('jDefined')) {
    if (options && typeof options === 'object') {
        methods.update.apply(this, Array.prototype.slice.call(arguments, 1));
    }
} else {
    methods.init.apply(this, Array.prototype.slice.call(arguments, 1));
}

多次用到 Array.prototype.slice.call(arguments, 1),不就是等于 arguments.slice(1) 吗?像前者那样写具体的好处是什么?

阅读 13.6k
2 个回答

因为arguments并不是真正的数组对象,只是与数组类似而已,所以它并没有slice这个方法,
而Array.prototype.slice.call(arguments, 1)可以理解成是让arguments转换成一个数组对象,让arguments具有slice()方法。
要是直接写arguments.slice(1)会报错

Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组;

var a={length:3,0:'abc',1:'def',2:'ghi'};
console.log(Array.prototype.slice.call(a));//  ["abc", "def",'ghi']
var a={length:0};
console.log(Array.prototype.slice.call(a));//  []
var a={length:3};
console.log(Array.prototype.slice.call(a));//  [undefined, undefined, undefined]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
101 新手上路
子站问答
访问
宣传栏