JS篇-Array.prototype.slice.call()详解

本文详细解析了JavaScript中的Array.prototype.slice.call()方法,揭示其将具有length属性的对象转换为数组的原理。通过call方法,使得Array.prototype.slice能作用于非Array对象如arguments,从而实现类似arguments.toArray().slice()的效果。文中还探讨了slice方法的内部实现,并指出使用此方法的关键在于对象必须有length属性。最后,通过计算多个数值总和的例子,展示了slice.call()在实际场景中的应用价值。

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

slice.call()这个方法第一次接触的时候很容易迷惑,它使arguments转换为array;更具体的理解是:

==》是能够将具有length属性的arguments转换为数组, 可以理解为 arguments.toArray().slice());

==>所以,这个过程我们是不是可以理解为 Array.prototype.slice.call(arguments)的实现过程就是把传入进来的具有length属性的第一个参数arguments转换为数组,再调用它的slice(截取)方法;

本人也看了不少教程和文章,下面分享下感觉比较理解的原理解释:

1. slice方法的内部实现(原理)

Array.prototype.slice = function(start,end){

    var result = new Array();
    start = start || 0;
    end = end || this.length; 
    // this指向调用的对象,当用了call后,能够改变this的指向,也就是指向传进来的对象,这是关键
  
    for(var i = start; i < end; i++)
    {
         result.push(this[i]);
    }

    return result;
}

所以整个过程可以分2步进行理解了

Array.prototype.slice.call(arguments)

第一步: 其中,arguments是一个具有length属性的对象, 通过call 这个方法,把arguments 指向了Array.prototype.slice方法的作用域,也就是说通过call方法,让Array.prototype.slice对arguments对象进行操作

理解第二步: Array.prototype.slice就是对该对象使用Array类的slice方法。但是呢arguments它又不是个Array对象,而是object;

所以我们没法用arguments.slice()方法,会报错。我们需要使用Array.prototype.slice, 它的作用就是第一步把arguments转换为一个Array对象,第二步对转换后的Array对象使用slice方法。

但是需要注意的是,一定要有length属性:

var my_object = {
    '0': 'zero',
    '1': 'one',
    '2': 'two',
    '3': 'three',
    '4': 'four',
    length: 5
};

let a = Array.prototype.slice.call(my_object,3)
a

result:

[ 'three', 'four' ]

如果没有length

var my_object = {
    '0': 'zero',
    '1': 'one',
    '2': 'two',
    '3': 'three',
    '4': 'four',
};

let a = Array.prototype.slice.call(my_object,3)
a

result:

[]

应用:那为什么我们要用slice.call()的方法呢?以一个具体的应用为案例:计算总和。

function addTwoNumbers(num1,num2){
  return num1+num2;
}

addTwoNumbers(24,25)

如果我们想加四个数字怎么办? 有两个方式:1. 声明一个全新的函数,分配四个变量;2. 在大dTwoNumbers这个函数中再套用一次“ addTwoNumbers”函数:

function addTwoNumbers(num1,num2){
  return num1+num2;
}

addTwoNumbers(addTwoNumbers(24,25),addTwoNumbers(26,27));

那如果想五个数值相加呢?这种做法显然不够明智;再写一个新的函数也非常麻烦,这时候我们可以采用slice.call()的方式

function addNumbers(){
  var argsArray = Array.prototype.slice.call(arguments);
  return argsArray.reduce((prev,cur)=>prev+cur);
}

addNumbers(24,25,26,27);

reference:
https://www.cnblogs.com/wphl-27/p/10336591.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值