2022-11-25
數組 arr 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
//判斷這個數組的第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都沒有傳入,當沒有傳參時默認從開始選擇到尾部所有的元素放在新數組中,因此才可以轉換為新數組。
開班時間:2021-04-12(深圳)
開班盛況開班時間:2021-05-17(北京)
開班盛況開班時間:2021-03-22(杭州)
開班盛況開班時間:2021-04-26(北京)
開班盛況開班時間:2021-05-10(北京)
開班盛況開班時間:2021-02-22(北京)
開班盛況開班時間:2021-07-12(北京)
預約報名開班時間:2020-09-21(上海)
開班盛況開班時間:2021-07-12(北京)
預約報名開班時間:2019-07-22(北京)
開班盛況Copyright 2011-2023 北京千鋒互聯科技有限公司 .All Right 京ICP備12003911號-5 京公網安備 11010802035720號