千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:长沙千锋IT培训  >  技术干货  >  深入理解数组的slice方法

深入理解数组的slice方法

来源:千锋教育
发布人:qyf
时间: 2023-02-02 17:05:55

深入理解数组的slice方法

  slice() 方法可从已有的数组中返回选定的元素。原数组不改变返回新选定的元素组成的新数组。

  数组.slice(start,end)

  start: 可选 数组从什么位置开始选择,如果没设置默认值是0,从开始选择。

  end :可选,数组截取到哪里,默认截取到数组的尾部

  var arr=[1,3,5,7,9];

  var arr1=arr.slice();//[1,3,5,7,9];从头开始选取

  var arr2=arr.slice(1);//[3,5,7,9];从下标1开始选择

  var arr3=arr.slice(-1);//[9];从倒数第1项开始选择

  var arr4=arr.slice(2,4);//[5,7]从第二项选择到第4项

  var arr5=arr.slice(-3,4);//[5,7]从倒数第3项选择到正数第4项

  var arr6=arr.slice(-3,-1);//[5,7]从倒数第三项选择到倒数第一项

  注释:您可使用负值从数组的尾部选取元素。

  注释:如果 end 未被规定,那么 slice() 方法会选取从 start 到数组结尾的所有元素。

  重点

  //返回一个对象,对象有max和min属性,求出当前参数的最大值和最小值

  function fn1(){

  var arr= Array.prototype.slice.call(arguments);

  if(arr.length===0) return;

  arr=arr.sort(function(a,b){return a-b});

  return {max:arr[arr.length-1],min:arr[0]};

  }

  fn1(3,5,7,9);//{max:9,min:3

  在这个案例中Array.prototype.slice.call(arguments)为什么会将伪数组转换为数组呢

  这个问题牵扯一下两种概念

  1、prototype 原型,所有的数组对象如果需要使用什么方法那就必须将这个方法增加在原型中,而且在必须在里面使用this,这个this就是这个数组对象

  例如:

  //求数组中数值元素的和

  Array.prototype.sum=function(){

  var sum=0;

  //this就是调用这个方法的数组

  for(var i=0;i<this.length;i++){< p="">

  //判断这个数组的第i项是不是数值

  if(!isNaN(this[i])){

  sum+=this[i];

  }

  }

  return sum;

  };

  var arr=[10,15,20,30,40];

  var sum=arr.sum();

  console.log(sum);//115;

  2、call 的作用,call在调用函数时可以替代函数中的this,例如:

  function fn2(){

  this.a=3;

  this.b=10;

  }

  fn2();//因为直接调用函数this就是window,

  //因此,这里等于给window增加属性a和b。

  //那么window的属性其实就是变量,因此实际上是增加变量a和b

  console.log(a,b);//3,10

  var obj={};

  fn2.call(obj);

  //这里将obj带入函数后替代函数中this,

  //因此,其实就是给obj增加属性a和属性b

  console.log(obj.a,obj.b);//3,10;

  那么现在我们解释一下Array.prototype.slice.call(arguments)。首先我们先模仿数组的原生API写一下slice,猜测哦,谁也不知道JS底层怎么写的。

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

  if (!start) start = 0;

  if (!end) end = this.length;

  if (start < 0) start = this.length + start;

  if (end < 0) end = this.length + end;

  var arr = [];

  for (var i = start; i < end; i++){

  arr.push(this[i]);

  }

  return arr;

  };

  var arr=[1,3,5,7,9];

  var arr1=arr.slice1(2,4);//[5,7];

  上面这个就是模拟了slice的函数内容。那么在这里,this就是这个数组。如果我们使用Array.prototype.slice1.call(arguments);那么就是把上面的这个方法中slice1函数中this用arguments替代了,类数组也是有下标的,因此,就相当于遍历取出每个下标存储在新的数组中,并且返回这个新数组。而这里call()后面没有带参,意味着直接调用了slice1,start和end都没有传入,当没有传参时默认从开始选择到尾部所有的元素放在新数组中,因此才可以转换为新数组。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

bootstrap是什么?有什么用处

2023-04-20

自旋锁原理是什么?自旋锁有什么优缺点

2023-03-17

Kafka的leader选举机制是什么

2023-03-03

最新文章NEW

多种java日志框架你真的了解吗

2023-03-17

如何查看git用户名和密码

2023-03-03

2分钟了解BFC

2023-02-06

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>