关于javascript:深入理解数组的slice方法

52次阅读

共计 1954 个字符,预计需要花费 5 分钟才能阅读完成。

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++){
            // 判断这个数组的第 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 都没有传入,当没有传参时默认从开始抉择到尾部所有的元素放在新数组中,因而才能够转换为新数组。

正文完
 0