摘要:每當(dāng)在末尾添加一項(xiàng)后,其都會(huì)自動(dòng)更新以反應(yīng)這一變化。從而存在兩個(gè)以上不同版本的構(gòu)造函數(shù)。如果數(shù)組中的某一項(xiàng)值是或,那么該值在和方法返回的結(jié)果中以空字符串表示。對(duì)數(shù)組每一項(xiàng)運(yùn)行給定函數(shù),返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組。
Array類(lèi)型
ECMAscrip與其他多數(shù)語(yǔ)言中數(shù)組的共同點(diǎn):
都是數(shù)據(jù)的有序列表
不同點(diǎn):數(shù)組的每一項(xiàng)可以保存任何類(lèi)型的數(shù)據(jù),數(shù)組的大小是可以動(dòng)態(tài)調(diào)整的,及隨著數(shù)據(jù)的添加自動(dòng)增長(zhǎng),以容納新增的數(shù)據(jù)
1 創(chuàng)建數(shù)組
1.1 同Object一樣,創(chuàng)建數(shù)組的方式有兩種
Arrey構(gòu)造函數(shù)
var colors = new Array();
向Array構(gòu)造函數(shù)中傳遞數(shù)組中應(yīng)該包含的項(xiàng),
var colors = new Array("red","green","blue");
給構(gòu)造函數(shù)傳遞一個(gè)數(shù)值,表示數(shù)組的長(zhǎng)度(項(xiàng)數(shù)),
var colors = new Array(3);
也可省略new操作符,
var colors = Ayyay(3); var colors = Array("red");
數(shù)組字面量表示法
數(shù)組字面量表示法由一對(duì)包含數(shù)組項(xiàng)的方括號(hào)表示,
var color = ["red","green","blue"];
1.2 讀取和設(shè)置數(shù)組的值
要使用方括號(hào)并提供相應(yīng)的值是基于0的數(shù)字索引。
var colors = ["red","blue","green"]; alert (colors[0]); colors[2] = "black"; //修改第三項(xiàng) colors[3] = "brown";//新增第四項(xiàng)
數(shù)組中的length屬性很有特點(diǎn):不是只讀的。通過(guò)設(shè)置這個(gè)屬性??梢詮臄?shù)組的末尾移除項(xiàng),或向數(shù)組中新增項(xiàng)。
移除一項(xiàng)
var colors = ["red","blue","green"];
colors.length = 2;
alert (colors[2]); //undefined
新增一項(xiàng)
var colors["red","bule","green"];
colors.length = 4;
alert(coloes[3]);//undefined
利用length屬性在末尾新增項(xiàng)
var colors = ["red","blue","green"];
colors[colors.length] = "black";
colors[colors.length] = "brown";
alert(colors[4]);//brown
由于數(shù)組的最后一項(xiàng)索引始終時(shí)length-1,所以下一項(xiàng)的位置就是length。每當(dāng)在末尾添加一項(xiàng)后,其length都會(huì)自動(dòng)更新以反應(yīng)這一變化。
對(duì)于單一的全局作用域,也就是對(duì)于有一個(gè)網(wǎng)頁(yè)或者一個(gè)全局作用域而言,使用instanceof操作符
if (value instanceof Array){//對(duì)數(shù)組執(zhí)行某些操作}
對(duì)于兩個(gè)以上不同的執(zhí)行環(huán)境,也就是如果網(wǎng)頁(yè)中包含多個(gè)模板。從而存在兩個(gè)以上不同版本的Array構(gòu)造函數(shù)。如果你從一個(gè)框架向另一個(gè)框架傳入一個(gè)數(shù)組,那么傳入的數(shù)組與在第二個(gè)框架中原生創(chuàng)建的數(shù)組分別具有各自不同的構(gòu)造函數(shù)。為解決這個(gè)問(wèn)題ECMAScript5新增了Array.isArray()方法。這個(gè)方法不管數(shù)組是在哪個(gè)全局執(zhí)行環(huán)境中創(chuàng)建的,都可以確定某個(gè)值是不是數(shù)組。
if(Array.isArray(value)){//對(duì)數(shù)組執(zhí)行某些操作};
支持Array.isArray()的方法瀏覽器有IE9+、Firefox4+、Safari5+、Opera 10.5、和Chrome。
var colors = ["red","blue","green"]; if(Array.isArray(colors)){ colors[0] = "balck"; alert(colors[0]); }轉(zhuǎn)換方法
所有對(duì)象都具有toLocaleString()、toString()和valueOf()方法
調(diào)用數(shù)組的toString()方法:返回由數(shù)組中 "每個(gè)值的字符串" 形式 "拼接" 而成的一個(gè)以逗號(hào)分割的 "字符串" 。
調(diào)用數(shù)組的valueOf()方法:返回的還是數(shù)組。
var aqiData = [ ["北京", 90], ["上海", 50], ["福州", 10], ["廣州", 50], ["成都", 90], ["西安", 100] ]; alert(aqiData.toString()); alert(aqiData.valueOf()); alert(aqiData); console.log(aqiData.toString()); console.log(aqiData.valueOf()); console.log(aqiData);
上面第9、10行代碼先顯式調(diào)用了toString()方法和valueOf()方法。第11行直接將數(shù)組傳遞給alert()。而alert()要接收字符串參數(shù),所以它會(huì)在后臺(tái)調(diào)用數(shù)組每一項(xiàng)的toString()方法。由此得到與直接調(diào)用toString()方法相同的結(jié)果。
調(diào)用數(shù)組的 toLocaleString()方法時(shí),它也會(huì)創(chuàng)建一個(gè)由數(shù)組中 "每個(gè)值的字符串" 形式 "拼接" 而成的一個(gè)以逗號(hào)分割的 "字符串" ,與前面兩個(gè)方法唯一不同之處在于取數(shù)組每一項(xiàng)的值調(diào)用的方法不一樣,這里取數(shù)組每一項(xiàng)值調(diào)用的是每一項(xiàng)的toLocaleString()方法,而不是toString()方法,前面講的是調(diào)用每一項(xiàng)的toString()方法。
var person1 = { toLocaleString : function(){ return "chenglong"; }, toString : function(){ return "lixiaolong"; } }; var person2 = { toLocaleString : function(){ return "lilianjie"; }, toString : function(){ return "chenzhen"; } }; var people = [person1,person2]; alert(people.toString()); alert(people); alert(people.toLocaleString()); console.log(people.toString()); console.log(people); console.log(people.toLocaleString());
join()指定分割符連接數(shù)組元素。只接受一個(gè)參數(shù),即用作分割符的字符串,返回包含所有數(shù)組項(xiàng)的字符串。如果不給join()傳入任何值或傳入undefined,則使用逗號(hào)作為分割符.而IE7或更早的版本會(huì)錯(cuò)誤的使用undefined作為分割符。
如果數(shù)組中的某一項(xiàng)值是null或undefined,那么該值在join(),toString(),valueOf()和toLocaleString()方法返回的結(jié)果中以空字符串表示。
棧方法ECMAScript也提供了一種讓數(shù)組的行為類(lèi)似于其他數(shù)據(jù)結(jié)構(gòu)的方法,具體說(shuō)來(lái),數(shù)組可以表現(xiàn)的就像棧一樣。棧是一種LIFO(后進(jìn)先出)的數(shù)據(jù)結(jié)構(gòu)。棧中項(xiàng)的插入和移除只發(fā)生在一個(gè)位置——棧的頂部。ECMAScript為數(shù)組提供了push()和pop()方法實(shí)現(xiàn)類(lèi)似棧的行為。
push()方法,可以接收任意數(shù)量的參數(shù),把他們逐個(gè)添加到數(shù)組的末尾,并返回修改后數(shù)組的長(zhǎng)度
pop()方法,從數(shù)組的末尾移除最后一項(xiàng),減少數(shù)組的length值,返回移除的項(xiàng)。
var colors = []; var count = colors.push("red","green"); alert(count);//2 var item = colors.pop(); alert(item);//green alert(colors.length);//1隊(duì)列方法
棧數(shù)據(jù)結(jié)構(gòu)的訪問(wèn)規(guī)則是LIFO(后進(jìn)先出),而另一種數(shù)據(jù)結(jié)構(gòu)——隊(duì)列數(shù)據(jù)結(jié)構(gòu),訪問(wèn)規(guī)則是FIFO(先進(jìn)先出)。隊(duì)列在列表的末端添加項(xiàng),從列表的前端移除項(xiàng)。末端添加項(xiàng)依舊使用push()方法,shift()方法可以移除數(shù)組的第一項(xiàng),并返回該項(xiàng),同時(shí)將數(shù)組長(zhǎng)度減1.
結(jié)合push()方法和shift()方法可以像使用隊(duì)列一樣使用數(shù)組。
var colors = []; var count = colors.push("red","green"); alert(count);//2 var item = colors.shift(); alert(item);//red alert(colors.length);//1
ECMAScript還為數(shù)組提供了unshift()方法,unshift()與shift()作用相反,unshift()是在數(shù)組的前端添加任意多個(gè)項(xiàng)并返回新數(shù)組的長(zhǎng)度。因此,同時(shí)使用unshitf()和pop()方法,可以從相反的方向模擬隊(duì)列。
var colors = []; var count = colors.unshift("red","green"); alert(count);//2 count = colors.unshift("black"); var item = colors.pop(); alert(item);//green alert(colors.length);//2
注:IE7及更早版本unshift()會(huì)返回undefined而不是數(shù)組的心長(zhǎng)度。IE8只在非兼容模式下返回正確的長(zhǎng)度。
重排序方法數(shù)組中有兩個(gè)可以排序的方法,reverse()和sort()。
reverse()會(huì)反轉(zhuǎn)數(shù)組項(xiàng)的順序。
var values = [1,3,5,2,4]; values.reverse(); alert(values); //4,2,5,3,1
默認(rèn)情況下sort()會(huì)按升序排列數(shù)組項(xiàng),但此升序非彼升序
為了實(shí)現(xiàn)排序,sort()會(huì)調(diào)用每個(gè)數(shù)組項(xiàng)的toString()轉(zhuǎn)換方法,然后比較得到的字符串,以確定如何排序。
var value = [0,1,5,10,15]; value.sort(); alert(value);//0,1,10,15,5
sort()方法比較的是字符串,字符串比較,"10"位與"5"前面。sort()方法還可以接收一個(gè)比較函數(shù)作為參數(shù),可實(shí)現(xiàn)我們期望的排序。
比較函數(shù)接收兩個(gè)參數(shù),如果第一個(gè)參數(shù)應(yīng)該位于第二個(gè)參數(shù)之前則返回負(fù)數(shù),如果兩個(gè)參數(shù)相等則返回零,如果第一個(gè)參數(shù)應(yīng)該位于第二個(gè)參數(shù)之后則返回正數(shù)。以下就是一個(gè)比較函數(shù)。
var myArray = [0,10,5,15,1]; function compare(value1,value2){ if (value1value2) { return 1; }else { return 0; } }; myArray.sort(compare); alert(myArray);//0,1,5,10,15
reverse()和sort()返回的是排序后的數(shù)組
操作方法concat()方法,可以基于當(dāng)前數(shù)組中的所有項(xiàng)創(chuàng)建一個(gè)新數(shù)組。具體說(shuō),這個(gè)方法會(huì)先創(chuàng)建當(dāng)前數(shù)組的一個(gè)副本,然后將接收到的參數(shù)添加到這個(gè)副本的末尾,最后返回新構(gòu)建的數(shù)組。1, 在沒(méi)有給concat()方法添加參數(shù)的情況下,他只是復(fù)制當(dāng)前數(shù)組并返回副本。2, 如果傳遞給concat()方法的是一個(gè)多個(gè)數(shù)組,則該方法會(huì)將這些數(shù)組中的每一項(xiàng)添加到結(jié)果數(shù)組中。3, 如果給concat()方法傳遞的不是數(shù)組,這些值會(huì)被簡(jiǎn)單的添加到結(jié)果數(shù)組的末尾。原來(lái)的數(shù)組colors(),保持不變
var colors = ["red","blue"]; var newColors = colors.concat("black",["yellow","brown"],["green"]); alert(colors);//red,blue alert(newColors);//red,blue,black,yellow,brown,green
slice()方法,基于當(dāng)前數(shù)組的一個(gè)或多個(gè)項(xiàng)創(chuàng)建一個(gè)新數(shù)組。slice()方法接收一個(gè)或兩個(gè)參數(shù),同concal()方法一樣,原來(lái)的數(shù)組不會(huì)被影響。注意,如果slice()參數(shù)中有一個(gè)是負(fù)數(shù),則用數(shù)組長(zhǎng)度加上該數(shù)來(lái)確定相應(yīng)位置。例一個(gè)包含5項(xiàng)的數(shù)組,slice(-2,-1)即slice(3,4)。如果結(jié)束位置小于起始位置,則返回空數(shù)組。
splice()方法,這個(gè)方法算是最強(qiáng)大的數(shù)組方法了。splice()方法的主要用途是向數(shù)組的中部插入項(xiàng)。使用的方式有如下3種。
1, 刪除,可以刪除任意數(shù)量的項(xiàng),只需指定2個(gè)參數(shù),要?jiǎng)h除的第一項(xiàng)的位置和要?jiǎng)h除的項(xiàng)數(shù)。
2, 插入,可以向指定的位置插入任意數(shù)量的項(xiàng),只需提供3個(gè)參數(shù),起始位置,0(要?jiǎng)h除的項(xiàng)數(shù)),和要插入的項(xiàng)。如果要插入多項(xiàng),可以插入任意多個(gè)項(xiàng)。例,splice(1,0,"red","yellow");
3, 替換,可以向指定的位置插入任意數(shù)量的項(xiàng),插入的項(xiàng)數(shù)不必與刪除的項(xiàng)數(shù)相等,例,splice(2,1,"red","blue");
splice()方法始終都會(huì)返回一個(gè)數(shù)組,該數(shù)組包含從原始數(shù)組中刪除的項(xiàng)(如果沒(méi)有刪除任何項(xiàng),就會(huì)返回一個(gè)空數(shù)組)。splice()會(huì)改變?cè)紨?shù)組。
var colors = ["red","blue","green"]; var colors2 = colors.splice(1,2); alert(colors2);//blue,green var colors3 = colors.splice(0,0,"black",["brown"]); alert(colors3);//[] alert(colors);//black,brown,red console.log(colors3); var colors4 = colors.splice(1,1,"yellow","purple"); alert(colors4);//brown alert(colors);//black,yellow,purple,red位置方法
indexOf()和lastIndexOf()方法。都接收兩個(gè)參數(shù),要查找的項(xiàng)和查找起點(diǎn)位置的索引(可選)。indexOf()從數(shù)組的0位置開(kāi)始向后查,lastIndexOf()從數(shù)組的末尾開(kāi)始向前查找。都返回要查找的項(xiàng)在數(shù)組中的位置。沒(méi)有找到的情況下返回-1,在比較第一個(gè)參數(shù)與數(shù)組中的項(xiàng)時(shí),使用全等操作符(必須嚴(yán)格相等)。支持這兩種方法的瀏覽器有IE9+,fireFox2+,Safari3+,Opera9.5+,Chrome。
var person = {name:"Nicholas"}; var people = [{name:"Nicholas"}]; var morePeople = [person]; alert(people.indexOf(person));//-1 alert(morePeople.indexOf(person));//0 alert(morePeople.indexOf({name:"Nicholas"}));//-1 console.log(morePeople);//[Object]迭代方法
ECMAScript為數(shù)組定義了5個(gè)迭代方法。每個(gè)方法都接收兩個(gè)參數(shù),要在每一項(xiàng)上運(yùn)行的函數(shù)和運(yùn)行該函數(shù)的作用域?qū)ο蟆绊憈his的值(可選)。傳入這些方法的函數(shù)會(huì)接收三個(gè)參數(shù):數(shù)組項(xiàng)的值、該項(xiàng)在數(shù)組中的位置和數(shù)組對(duì)象本身。根據(jù)使用的方法不同,這個(gè)函數(shù)執(zhí)行后的返回值可能會(huì)也可能不會(huì)影響訪問(wèn)的返回值。
every():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定的函數(shù),如果該函數(shù)對(duì)每一項(xiàng)都返回true,則返回 true.
filter():對(duì)數(shù)組的每一項(xiàng)都運(yùn)行給定數(shù)組,返回 該函數(shù)會(huì)返回true的項(xiàng) 組成的數(shù)組。
forEach():對(duì)數(shù)組的每一項(xiàng)運(yùn)行給定的函數(shù),這個(gè)方法沒(méi)有返回值。
map():對(duì)數(shù)組每一項(xiàng)運(yùn)行給定函數(shù),返回 每次函數(shù)調(diào)用的結(jié)果 組成的數(shù)組。
some():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定的數(shù)組,如果該函數(shù)對(duì)任一項(xiàng)返回true,則返回true.
var numbers = [1,2,3,4,5,4,3,2,1]; var everyResult = numbers.every(function(item,index,array){ console.log(item); return item > 2; }); var someResult = numbers.some(function(item,index,array){ console.log("someResult"+item); return item > 2; }); alert(everyResult); alert(someResult);
var aqiData = [ ["北京", 90], ["上海", 50], ["福州", 10], ["廣州", 50], ["成都", 90], ["西安", 100] ]; var filterResult = aqiData.filter(function(item,index,array){ //console.log(item[1]); return item[1] > 60; }); alert(filterResult);
var numbers = [1,2,3,4,5,4,3,2,1]; numbers.forEach(function(item,index,array){ if (item>3) { alert(item); } });
支持這些迭代方法的瀏覽器有IE9+、FireFox2+、Safari3+、Opera9.5+、Chrome
縮小方法ECNAScript還增加了兩個(gè)縮小方法,reduce()和reduceRight().這兩個(gè)方法都會(huì)迭代數(shù)組的所有項(xiàng),然后構(gòu)建一個(gè)最終返回的值。其中reduce()從數(shù)組的第一項(xiàng)開(kāi)始,逐個(gè)遍歷到最后,而reduceRight()從數(shù)組的最后一項(xiàng)開(kāi)始,向前遍歷到第一項(xiàng)。
這兩個(gè)方法都接收兩個(gè)參數(shù):一個(gè)在每一項(xiàng)上調(diào)用的函數(shù)和最為縮小基礎(chǔ)的初始值(可選),傳遞給他們的函數(shù)接收4個(gè)參數(shù):前一個(gè)值,當(dāng)前值,項(xiàng)的索引和當(dāng)前對(duì)象。
這個(gè)函數(shù)返回的任何值都會(huì)最為第一個(gè)參數(shù)自動(dòng)傳給下一項(xiàng)。第一次迭代發(fā)生在數(shù)組的第二項(xiàng)上,因此第一參數(shù)就是數(shù)組的第一項(xiàng),第二個(gè)參數(shù)就是數(shù)組的第二項(xiàng)。
//執(zhí)行數(shù)組中所有值之和的操作
var values = [1,2,3,4,5]; var sum = values.reduce(function(prev,cur,index,array){ return prev+cur; }); alert(sum);//15
第一次訪問(wèn)函數(shù),prev是1,cur是2;第二次,prev是3(1+2結(jié)果),cur是3(數(shù)組第三項(xiàng))
支持這些迭代方法的瀏覽器有IE9+、FireFox3+、Safari4+、Opera10.5+、Chrome
參考:JS高級(jí)程序設(shè)計(jì)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82508.html
摘要:有種內(nèi)置類(lèi)型,分別是除對(duì)象之外,其他統(tǒng)稱(chēng)為基本類(lèi)型。另一個(gè)需要注意的是數(shù)組確切地說(shuō),數(shù)組也是的一個(gè)子類(lèi)型我們可以通過(guò)下面的方法檢查變量是不是數(shù)組處理未聲明的變量時(shí),會(huì)返回這是因?yàn)橛幸粋€(gè)特殊的安全防范機(jī)制。 js有7種內(nèi)置類(lèi)型,分別是undefined null boolean string number symbol object除對(duì)象之 Object 外,其他統(tǒng)稱(chēng)為基本類(lèi)型。符號(hào) ...
摘要:函數(shù)類(lèi)型檢測(cè)是的子類(lèi)型,其屬性為參數(shù)個(gè)數(shù),但是判斷結(jié)果有內(nèi)建函數(shù)原生函數(shù)常見(jiàn)的有,可能被當(dāng)作構(gòu)造函數(shù)來(lái)使用,創(chuàng)建出來(lái)的是封裝了的基本類(lèi)型值。構(gòu)造函數(shù)可以不帶關(guān)鍵字。建議使用和來(lái)進(jìn)行顯示強(qiáng)制轉(zhuǎn)換。 前言 此篇小結(jié)來(lái)源與《你不知道的JavaScript》和《JavaScript高級(jí)程序設(shè)計(jì)》的結(jié)合??或許是的,龜速總結(jié)中... 七種內(nèi)置類(lèi)型 null undefined boolean ...
摘要:使用構(gòu)造函數(shù)屬性來(lái)判斷對(duì)象的類(lèi)型檢查數(shù)字實(shí)際上是否為字符串如果是,則把字符串解析為整數(shù)檢查字符串實(shí)際上是否為數(shù)組如果是,則根據(jù)數(shù)組用逗號(hào)歸并出字符串來(lái)變量的類(lèi)型檢查變量變量變量構(gòu)造函數(shù)用閉包實(shí)現(xiàn)的函數(shù)化數(shù)字求和函數(shù)的函數(shù)生成器返回一個(gè)簡(jiǎn)單的 showImg(https://segmentfault.com/img/remote/1460000006766748?w=3456&h=460...
摘要:解耦優(yōu)勢(shì)代碼復(fù)用,單元測(cè)試。常用比較誤區(qū)可同時(shí)判斷,可用來(lái)判斷對(duì)象屬性是否存在。使用作判斷無(wú)法進(jìn)行充分的類(lèi)型檢查。文件中應(yīng)用常量參考文檔高級(jí)程序設(shè)計(jì)作者以樂(lè)之名本文原創(chuàng),有不當(dāng)?shù)牡胤綒g迎指出。 showImg(https://segmentfault.com/img/bVburXw?w=500&h=400); 編寫(xiě)可維護(hù)性代碼 可維護(hù)的代碼遵循原則: 可理解性 (方便他人理解) 直觀...
摘要:作用域鏈查找作用域鏈的查找是逐層向上查找。而全局變量和閉包則會(huì)與之相反,繼續(xù)保存,所以使用用后需手動(dòng)標(biāo)記清除,以免造成內(nèi)存泄漏。獲取元素的屬性獲取元素的屬性等參考文檔高級(jí)程序設(shè)計(jì)作者以樂(lè)之名本文原創(chuàng),有不當(dāng)?shù)牡胤綒g迎指出。 showImg(https://segmentfault.com/img/bVburXV?w=500&h=399); 作用域鏈查找 作用域鏈的查找是逐層向上查找。查...
閱讀 3079·2021-11-25 09:43
閱讀 1676·2021-11-24 11:15
閱讀 2397·2021-11-22 15:25
閱讀 3553·2021-11-11 16:55
閱讀 3272·2021-11-04 16:10
閱讀 2809·2021-09-14 18:02
閱讀 1714·2021-09-10 10:50
閱讀 1102·2019-08-29 15:39