对[].slice.call(arguments,1) 的一丢丢见解

本文探讨了JavaScript中使用[].slice.call(arguments,1)的原因。文章指出,由于arguments对象不是真正的数组,其原型链上没有slice方法。作者通过这种方式利用数组的slice方法,通过call显式绑定,使arguments对象能够调用slice,从而实现参数切割的功能。" 131587680,8070352,C++与C语言数组拷贝及C++ Vector拷贝解析,"['C++', '开发语言', '数据结构']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

 今天偶然翻资料看到一个叫做软绑定的函数,用来确定this的;

原代码

 if(!Function.prototype.softBind){
           Function.prototype.softBind = function(obj){
               var fn = this;
               var curried = [].slice.call(arguments,1);
               var bound = function(){
                   return fn.apply(
                       (!this || this === (window || global)) ? obj:this,
                       curried.concat.apply(curried,arguments);
                   )
               };
               bound.prototype = Object.create(fn.prototype);
               return bound;
           }
       }

看到[].slice.call(arguments,1) 这个写法我一脸懵逼,为何?

arguments是一个对象而不是数组..而且自身的原型链上也没有slice这个方法;


个人见解

  • []自身也是也是一个对象.而数组原型链上有这个slice这个方法,通过call显式绑定来实现arguments变相有slice这个方法
   /*此处的返回值是true*/
   [].slice === Array.prototype.slice;

   /*确定arguments的类型
    * 返回 3,Object, true;
    */
    (function(a,b,c){
       console.log(arguments.length);
       console.log(typeof arguments);
       console.log( arguments instanceof Object);

    }(1,2,3))


   /*我们自身也可以模拟一个对象传入,我们这里用数组对象,不是等同,只是道理差不多的*/
   aargument =  [1,2,3,4];
   [].slice.call(aargument,3);   //返回[4]
   [].slice.call(aargument,1,3); //[2, 3]

总结

那个写法就是裁切arguments传入的参数,保存起来操作;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

crper

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值