关于slice方法参数的问题

// 模拟Array.of方法
const MOCK_ARRAY_OF = function() {
    return [].slice.call(arguments);
};
// 使用模拟的方法来创建数组
let arrOfMock = MOCK_ARRAY_OF(3, 2, 1);
console.log(arrOfMock); // [ 3, 2, 1 ]

作者:dreamapplehappy
链接:https://zhuanlan.zhihu.com/p/24377094
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我在逛论坛的时候发现这个代码,我现在有个疑惑,slice它的

clipboard.png

第一个参数不应该是起始位置吗?为什么这里给他的是一个对象(arguments),这样为啥可以,有人可以解释吗

阅读 5k
5 个回答

看一下call和apply吧,另外slice的第一个参数是可以省略的,省略时默认从0开始

fun.call(thisArg[, arg1[, arg2[, ...]]])

参数

thisArg

在fun函数运行时指定的this值。需要注意的是,指定的this值并不一定是该函数执行时真正的this值,如果这个函数处于非严格模式下,则指定为null和undefined的this值会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的this会指向该原始值的自动包装对象。

arg1,arg2……

参数列表

简单理解

第一个参数来改变this指向的,你传递的对象来代替方法中this对象,比如全局方法中this代表window,但当你调用时,使用call来调用,第一个参数你传了一个你自定义的对象,那你方法中this指向的就是你自定义的对象,
比如:

var name='zhangsan';
function showName(){
    document.writeln(this.name);
}
showName();   //zhangsan

var lisi={name:'lisi'};
showName.call(lisi);  //lisi

至于后面的参数就是原方法需要的参数,按顺序依次传入,比如:

var name='zhangsan';
function showName(sex,age){
    document.writeln(this.name+','+sex+','+age);
}
showName('male','28');    //zhangsan,male,28 

var lisi={name:'lisi'};
showName.call(lisi,'female','30');  //lisi,female,30

return [].slice.call(arguments);
这个地方是对象冒充机制吧 跟slice怎么用的没有关系

其实你要看的不是slice文档,而是callapply的文档

应该先call这个方法看一下

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题