Array.prototype.slice.call(arguments)

第一眼看到这个我是比较懵逼的

function say(name,world){
    console.log(name+":"+world);
}
function b(){
    say.apply(null,['张三'].concat(Array.prototype.slice.call(arguments)));
}
b("名字");

这里写图片描述

之前从来没有遇见过 ,所以第一眼就有点懵逼

来看看此时arguments他到底会输出什么
这里写图片描述
看图貌似是一个对象?json对象?我们来看看他的类型
这里写图片描述
然后在看看Array.prototype.slice.call(arguments)会是啥
这里写图片描述
可以看到他是一个数组,那么很显然这个的作用是吧对象转成一个数组,那么似乎就影刃而解了

我们来拆开研究一下

首先slice是有两个用法的

String.slice:返回一个字符串
Array.slice :返回一个数组


  • 首先是Array同Object,Number等 都是一种数据类型的名字,同时Array又是构造函数,每个构造函数都有一个prototype属性指向其原型对象。其原型对象上能取到slice方法。
  • 什么是类数组(有length属性,属性值为数字;其他属性值为数字‘0’,‘1’,等)
  • slice本来只是Array和 String的方法,为什么可以直接用在类数组上面?

    看看Array.prototype.slice的源码

查看 V8 引擎 array.js 的源码,可以将 slice 的内部实现简化为:  

function slice(start, end) {   
var len = ToUint32(this.length), result = [];   
for(var i = start; i < end; i++) {   
    result.push(this[i]);   
}   
    return result;   
}       
可以看出,slice 并不需要 this 为 array 类型,只需要有 length 属性即可。并且 length 属性可以不为 number 类型,当不能转换为数值时,ToUnit32(this.length) 返回 0.  

另一种写法

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值