关于[].slice.call(arguments, 1)自己的思考

[].slice.call(arguments, 1) 可以看作是 Array.prototype.slice.call(arguments,1)
它是能够将具有length属性的对象转成数组,


首先我们要明确一点就是两个东西,第一是slice方法;
.slice() 方法可从已有的数组中返回选定的元素。

var arr = new Array(3)  
arr[0] = "George"  
arr[1] = "John"  
arr[2] = "Thomas"  
console.log(arr.slice(0))   // VM1450:5 ["George", "John", "Thomas"]
console.log(arr.slice(0,2)) // VM1620:5 ["George", "John"] 
console.log(arr.slice(-1))   //VM1728:5 ["Thomas"]

可以看出slice() 方法是返回参数内给定的位置的新的数组;


.call():调用一个对象的一个方法,以另一个对象替换当前对象。

function add(a,b)  
{  
    alert(a+b);  
}  
function sub(a,b)  
{  
    alert(a-b);  
}  

add.call(sub,3,1);   
 这个例子中的意思就是用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。

arguments 对象:arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性。arguments非常类似Array,但实际上又不是一个Array实例;它可以直接用来调用函数参数

function doAdd() {
  if(arguments.length == 1) {
    alert(arguments[0] + 5);
  } else if(arguments.length == 2) {
    alert(arguments[0] + arguments[1]);
  }
}

doAdd(10);  //输出 "15"
doAdd(40, 20);  //输出 "60"

最后我们来看
Array.prototype.slice.call(arguments,1)
arguments是一个关键字,代表当前参数,在javascript中虽然arguments表面上以数组形式来表示,但实际上没有原生数组slice的功能,这里使用call方法算是对arguments对象不完整数组功能的修正,也就是说Array.prototype.slice.call(arguments)能够将arguments转成数组

var toArray = function(s){
    try{
        return Array.prototype.slice.call(s);
    } catch(e){
            var arr = [];
            for(var i = 0,len = s.length; i < len; i++){
                //arr.push(s[i]);
                   arr[i] = s[i];  //据说这样比push快
            }
             return arr;
    }
}

var a  =  new toArray(1,2,3)
console.log(a) // VM5723:14 [1, 2, 3]
var toArray = function(s){
    try{
        return Array.prototype.slice.call(arguments,1);
            // 将arguments当作数组使用,并返回从1开始后的新的数组
    } catch(e){
            var arr = [];
            for(var i = 0,len = s.length; i < len; i++){
                //arr.push(s[i]);
                   arr[i] = s[i];  //据说这样比push快
            }
             return arr;
    }
}
var a  =  new toArray(1,2,3)
console.log(a) // VM6028:14 [2, 3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值