深入理解數(shù)組的slice方法
slice() 方法可從已有的數(shù)組中返回選定的元素。原數(shù)組不改變返回新選定的元素組成的新數(shù)組。
數(shù)組.slice(start,end)
start: 可選 數(shù)組從什么位置開(kāi)始選擇,如果沒(méi)設(shè)置默認(rèn)值是0,從開(kāi)始選擇。
end :可選,數(shù)組截取到哪里,默認(rèn)截取到數(shù)組的尾部
var arr=[1,3,5,7,9];
var arr1=arr.slice();//[1,3,5,7,9];從頭開(kāi)始選取
var arr2=arr.slice(1);//[3,5,7,9];從下標(biāo)1開(kāi)始選擇
var arr3=arr.slice(-1);//[9];從倒數(shù)第1項(xiàng)開(kāi)始選擇
var arr4=arr.slice(2,4);//[5,7]從第二項(xiàng)選擇到第4項(xiàng)
var arr5=arr.slice(-3,4);//[5,7]從倒數(shù)第3項(xiàng)選擇到正數(shù)第4項(xiàng)
var arr6=arr.slice(-3,-1);//[5,7]從倒數(shù)第三項(xiàng)選擇到倒數(shù)第一項(xiàng)
注釋:您可使用負(fù)值從數(shù)組的尾部選取元素。
注釋:如果 end 未被規(guī)定,那么 slice() 方法會(huì)選取從 start 到數(shù)組結(jié)尾的所有元素。
重點(diǎn)
//返回一個(gè)對(duì)象,對(duì)象有max和min屬性,求出當(dāng)前參數(shù)的最大值和最小值
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
在這個(gè)案例中Array.prototype.slice.call(arguments)為什么會(huì)將偽數(shù)組轉(zhuǎn)換為數(shù)組呢
這個(gè)問(wèn)題牽扯一下兩種概念
1、prototype 原型,所有的數(shù)組對(duì)象如果需要使用什么方法那就必須將這個(gè)方法增加在原型中,而且在必須在里面使用this,這個(gè)this就是這個(gè)數(shù)組對(duì)象
例如:
//求數(shù)組中數(shù)值元素的和
Array.prototype.sum=function(){
var sum=0;
//this就是調(diào)用這個(gè)方法的數(shù)組
for(var i=0;i<this.length;i++){< p="">
//判斷這個(gè)數(shù)組的第i項(xiàng)是不是數(shù)值
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在調(diào)用函數(shù)時(shí)可以替代函數(shù)中的this,例如:
function fn2(){
this.a=3;
this.b=10;
}
fn2();//因?yàn)橹苯诱{(diào)用函數(shù)this就是window,
//因此,這里等于給window增加屬性a和b。
//那么window的屬性其實(shí)就是變量,因此實(shí)際上是增加變量a和b
console.log(a,b);//3,10
var obj={};
fn2.call(obj);
//這里將obj帶入函數(shù)后替代函數(shù)中this,
//因此,其實(shí)就是給obj增加屬性a和屬性b
console.log(obj.a,obj.b);//3,10;
那么現(xiàn)在我們解釋一下Array.prototype.slice.call(arguments)。首先我們先模仿數(shù)組的原生API寫(xiě)一下slice,猜測(cè)哦,誰(shuí)也不知道JS底層怎么寫(xiě)的。
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];
上面這個(gè)就是模擬了slice的函數(shù)內(nèi)容。那么在這里,this就是這個(gè)數(shù)組。如果我們使用Array.prototype.slice1.call(arguments);那么就是把上面的這個(gè)方法中slice1函數(shù)中this用arguments替代了,類數(shù)組也是有下標(biāo)的,因此,就相當(dāng)于遍歷取出每個(gè)下標(biāo)存儲(chǔ)在新的數(shù)組中,并且返回這個(gè)新數(shù)組。而這里call()后面沒(méi)有帶參,意味著直接調(diào)用了slice1,start和end都沒(méi)有傳入,當(dāng)沒(méi)有傳參時(shí)默認(rèn)從開(kāi)始選擇到尾部所有的元素放在新數(shù)組中,因此才可以轉(zhuǎn)換為新數(shù)組。

猜你喜歡LIKE
相關(guān)推薦HOT
更多>>
json格式是什么意思
JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,常用于前后端數(shù)據(jù)傳輸、配置文件和日志文件等場(chǎng)景中。JSON 采用鍵值對(duì)的方式來(lái)...詳情>>
2023-04-11 13:51:20
什么是mybatisplus?有什么特點(diǎn)
Mybatis-Plus(簡(jiǎn)稱MP)是一個(gè)基于Mybatis的持久開(kāi)源層框架,它在Mybatis的基礎(chǔ)上擴(kuò)展了一些實(shí)用的功能,使開(kāi)發(fā)更加簡(jiǎn)單、快速。以下是Mybatis-Pl...詳情>>
2023-03-06 16:05:42
zookeeper集群配置怎樣操作
ZooKeeper是一個(gè)分布式應(yīng)用程序協(xié)調(diào)服務(wù),它使用一組服務(wù)器來(lái)提供高可用性和容錯(cuò)性。要配置ZooKeeper集群,需要完成以下步驟:1.下載和安裝ZooK...詳情>>
2023-03-03 11:23:01
性能測(cè)試的指標(biāo)是什么
性能測(cè)試是一種通過(guò)測(cè)量系統(tǒng)或應(yīng)用程序的特定方面來(lái)評(píng)估其性能的測(cè)試方法。性能測(cè)試可以幫助發(fā)現(xiàn)性能瓶頸,優(yōu)化應(yīng)用程序或系統(tǒng)的性能,從而提高...詳情>>
2023-03-01 10:11:00熱門推薦
技術(shù)干貨







快速通道 更多>>
-
課程介紹
點(diǎn)擊獲取大綱 -
就業(yè)前景
查看就業(yè)薪資 -
學(xué)習(xí)費(fèi)用
了解課程價(jià)格 -
優(yōu)惠活動(dòng)
領(lǐng)取優(yōu)惠券 -
學(xué)習(xí)資源
領(lǐng)3000G教程 -
師資團(tuán)隊(duì)
了解師資團(tuán)隊(duì) -
實(shí)戰(zhàn)項(xiàng)目
獲取項(xiàng)目源碼 -
開(kāi)班地區(qū)
查看來(lái)校路線