數(shù)組數(shù)據(jù)的組合
數(shù)組是最簡(jiǎn)單的數(shù)據(jù)儲(chǔ)存結(jié)構(gòu)瘫析,在我們幾乎所有的編程語言都原生支持?jǐn)?shù)組類型扫腺,js里也是支持?jǐn)?shù)組的。
數(shù)組寫法示例
1过牙、var arr1=["a","b","c","d","e","f"];
2社牲、var arr2=[6,2,4,5,8,0,2,1,3,5,6];
數(shù)組必須寫在[ ]中粪薛,并且數(shù)組和對(duì)象相同的是它們都是通過引用的方式使用里面的內(nèi)容的悴了,所以要給數(shù)組建立一個(gè)引用的地址搏恤,如arr1、arr2
在創(chuàng)建數(shù)組是我們要注意
1湃交、每個(gè)數(shù)據(jù)都使用逗號(hào)分隔
2熟空、數(shù)據(jù)可以是任何類型
3、數(shù)據(jù)順序排列
4搞莺、可以重復(fù)
數(shù)組和對(duì)象一樣都是引用數(shù)據(jù)類型
數(shù)組中的數(shù)據(jù)按照順序從0開始排列的息罗,從0開始,我們把這個(gè)叫做索引才沧,也叫做下標(biāo)
把數(shù)組中的每個(gè)相對(duì)應(yīng)的數(shù)據(jù)叫做元素迈喉,或者簡(jiǎn)稱元
arr1[0]="z";
console.log(arr1);
在這個(gè)部分的0叫做下標(biāo)绍刮,后面添加的"z"叫做元素 ?,此時(shí)整個(gè)arr1[0]叫做下標(biāo)變量,上邊的這個(gè)寫法可以更改數(shù)組的第0項(xiàng)為z
數(shù)組的新建方式
1挨摸、字面量創(chuàng)建
var arr=[4,5,3,6,2,1];
2孩革、構(gòu)造函數(shù)創(chuàng)建
var ?arr1=new Array(4,5,3,6,2,1);
如果通過數(shù)組的構(gòu)造函數(shù)創(chuàng)建數(shù)組,參數(shù)僅有1個(gè)得运,且這個(gè)參數(shù)是正整數(shù)膝蜈,則表示新建一個(gè)具備該正整數(shù)長(zhǎng)度的空數(shù)組,里面有這個(gè)長(zhǎng)度的若干空元素
var arr=new Array(6);??Array(6)里面這個(gè)數(shù)字就是數(shù)組的長(zhǎng)度熔掺,沒有元素
如果是負(fù)數(shù)或者小數(shù)時(shí)饱搏,報(bào)錯(cuò)
?var arr2=new Array(-5);
?var arr2=new Array(3.5);
如果輸入的不是數(shù)值,是其他類型時(shí)置逻,這個(gè)數(shù)據(jù)就會(huì)作為該數(shù)組的第0個(gè)元素推沸,長(zhǎng)度為1
var arr2=new Array("a");
數(shù)組的長(zhǎng)度length
在上邊提到過幾次數(shù)組的長(zhǎng)度,數(shù)組的長(zhǎng)度我們可以通過length來查看
如下方是個(gè)數(shù)組
var arr=[1,2,3,4,5];
此時(shí)我們就可以用arr.length來查看數(shù)組的長(zhǎng)度
console.log(arr.length);
我們把a(bǔ)rr.length打印出來這時(shí)我們就可以在控制臺(tái)查看數(shù)組的長(zhǎng)度
arr.length除了可以查看數(shù)組的長(zhǎng)度還可以更改數(shù)組的長(zhǎng)度
arr.length=3;??
此時(shí)數(shù)組的長(zhǎng)度被修改為3券坞,修改為3后坤学,后面的元素將會(huì)被刪除,只保留前三個(gè)报慕,如果內(nèi)容小于3時(shí)深浮,后面將會(huì)用空元素填充,直到數(shù)組長(zhǎng)度為3
除了設(shè)置數(shù)組長(zhǎng)度和查看數(shù)組長(zhǎng)度外arr.length還可以用來清空數(shù)組設(shè)置arr.length=0;這樣整個(gè)數(shù)組清空眠冈。
在此順便提一嘴元素的個(gè)數(shù)就是數(shù)組的長(zhǎng)度
數(shù)組的最大下標(biāo)是數(shù)組的長(zhǎng)度-1(元素個(gè)數(shù)-1);
因?yàn)閿?shù)組是從0開始排序計(jì)算飞苇,而長(zhǎng)度是從1開始排序計(jì)算,所以數(shù)組的最大下標(biāo)是數(shù)組的長(zhǎng)度-1
數(shù)組的使用
在數(shù)組中所有的下標(biāo)都會(huì)轉(zhuǎn)換為number蜗顽,如果不能轉(zhuǎn)換為number的(也就是轉(zhuǎn)換后是NaN的)布卡,就會(huì)默認(rèn)添加對(duì)象的屬性名
數(shù)組的長(zhǎng)度,僅記錄下標(biāo)的個(gè)數(shù)雇盖,不包含屬性數(shù)量
數(shù)組不可以使用點(diǎn)語法獲取下標(biāo)變量忿等,但是數(shù)組中如果有屬性可以使用點(diǎn)語法取屬性
遍歷數(shù)組
循環(huán)遍歷
var arr = [5, 2, 7, , 4, 9, 6];
??????arr["a"] = 10;
將這個(gè)數(shù)組循環(huán)一遍
??????for(var i=0;i<arr.length;i++){
console.log("索引值"+i+":"+arr[i]);
i為第幾個(gè)
arr[i]為數(shù)值第i個(gè)的值
????????}
for ?in遍歷
var arr=[a:1,b:2,c:3];
????????for(var prop in obj){
?console.log(arr[prop ]); ???
prop就是鍵,屬性名
arr[prop]就是當(dāng)前prop屬性的值崔挖,屬性值
????????}
同時(shí)for ?in也可以復(fù)制數(shù)組
? var arr=[a:1,b:2,c:3];
????????var o=[];
????????for(var prop in obj){
????????????o[prop]???=????obj[prop];
屬性 屬性值
????????}
????????console.log(o);
注意數(shù)組的循環(huán)是根據(jù)下標(biāo)的數(shù)字從0開始循環(huán)到最大下標(biāo)贸街,有序?qū)ο笫茄h(huán)所有屬性名,無序?qū)ο蟮膶傩员闅v是根據(jù)對(duì)象屬性名添加的順序
for in和for的區(qū)別
當(dāng)使用for in遍歷時(shí)狸相,會(huì)將所有屬性包括下標(biāo)都會(huì)轉(zhuǎn)為字符型
數(shù)組的下標(biāo)薛匪,如果給讓的是字符,會(huì)轉(zhuǎn)換成數(shù)值
for in不會(huì)遍歷空元素脓鹃,for會(huì)遍歷空元素
for in可以遍歷到數(shù)組的屬性逸尖,for只能遍歷數(shù)組所有下標(biāo),不能遍歷屬性
push在數(shù)組尾部添加一個(gè)或者多個(gè)元素,并且返回?cái)?shù)組的新長(zhǎng)度
arr.push(6);//在數(shù)組的尾部插入一個(gè)新元素
arr.push(6,7,8);//在數(shù)組的尾部插入多個(gè)新元素
var a=arr.push(6,7,8);//通過添加到尾部元素后返回?cái)?shù)組的新長(zhǎng)度
unshift在數(shù)組頭部添加一個(gè)或者多個(gè)元素娇跟,并且返回?cái)?shù)組的新長(zhǎng)度
arr.unshift(0);//在數(shù)組的頭部插入一個(gè)新元素
arr.unshift(-3,-2,-1,0);//在數(shù)組的頭部插入多個(gè)新元素
var a=arr.unshift(-3,-2,-1,0);//返回?cái)?shù)組的新長(zhǎng)度
pop刪除數(shù)組尾部的最后一個(gè)元素岩齿,并且將這個(gè)被刪除的元素返回
arr.pop();//pop中沒有參數(shù),刪除數(shù)組的最尾部一個(gè)元素
var a=arr.pop();//pop刪除數(shù)組的最尾部一個(gè)元素,并且將被刪除的元素返回
arr.pop();與arr.length--;的區(qū)別
arr.length--; //等同 速度更快苞俘,但是不會(huì)返回被刪除的元素
arr.pop();//速度慢纯衍,但是會(huì)返回被刪除的元素
shift()刪除數(shù)組的第一個(gè)元素,并且返回被刪除的元素
arr.shift();//將數(shù)組的第一個(gè)元素刪除
var a=arr.shift();//將數(shù)組的第一個(gè)元素刪除苗胀,并且返回這個(gè)被刪除的元素
注意不管刪除還是添加都會(huì)改變數(shù)組的長(zhǎng)度
為了方便理解我們可以用js重構(gòu)這些
重構(gòu)push
<body>
????<script>
??????var?arr?=?[1,?2,?3,?4,?5];
??????function?pushs(arr,tian)?{
????????arr[arr.length]?=?tian;
????????return?chang?=?arr.length;
????????//?console.log(arr);
??????}
??????var?chang=pushs(arr,3);
??????console.log(chang,arr)
????</script>
????<script>
????????var?arr1=[1,2,3,4,5];
????????var?kong=[];
????????console.log("原始數(shù)組"+arr1+"數(shù)組長(zhǎng)度"+arr1.length);
????????push1(arr1,[6,7,8,9])
????????function?push1(arr1,kong){
????????????for(var?i=0;i<kong.length;i++){
????????????????arr1[arr1.length]=kong[i]
????????????}
????????????console.log("新數(shù)組"+arr1+"長(zhǎng)度"+arr1.length)
????????}
????</script>
重構(gòu)pop
var arr=[1,2,3,4,5,6,7];
????????function pops(arr){
????????????var item=arr[arr.length-1];
????????????arr.length--;
????????????return item;
????????}
???????var item=pops(arr);
????// ???arr.pop();
????????console.log(arr,item);
重構(gòu)unshift
var arr=[1,2,3,4,5,6,7];
function unshifts(arr,item){
????????????var maxIndex=arr.length-1;
????????????for(var i=maxIndex;i>=0;i--){
????????????????arr[i+1]=arr[i];
????????????}
???????????arr[0]=item;
???????????return arr.length;
????????}
???????var n=unshifts(arr,5);
???????console.log(n,arr); */
重構(gòu)shift
<script>
??????var?arr?=?[3,?2,?3,?4,?5,?6,?7,?8];
??????function?shifts()?{
????????var?fan?=?arr[0];
????????for?(var?i?=?0;?i?<?arr.length?-?1;?i++)?{
??????????arr[i]?=?arr[i?+?1];
????????}
????????arr.length--;
????????return?fan;
??????}
??????var?fan?=?-shifts(arr);
??????console.log(arr,?fan);
????</script>
concat數(shù)組的合并襟诸,合并后會(huì)返回一個(gè)新數(shù)組,原來的兩個(gè)數(shù)組不會(huì)變化
var arr=[1,2,3,4];
var arr1=[5,6,7,8];
數(shù)組的合并基协,合并后會(huì)返回一個(gè)新數(shù)組歌亲,原來的兩個(gè)數(shù)組不會(huì)變化
var arr2=arr.concat(arr1);
數(shù)組除了可以合并數(shù)組,也可以合并元素澜驮,將多個(gè)元素與原數(shù)組合并陷揪,返回新數(shù)組
var arr3=arr.concat(0,-1,-2);
concat既可以合并元素,也可以合并數(shù)組
var arr4=arr.concat(0,arr1,["A","B"]);
如果直接使用concat杂穷,就可以完成數(shù)組的復(fù)制功能
var arr5=arr.concat();
join就是將數(shù)組的每個(gè)元素以指定的字符連接形成新字符串返回
var ?arr=[1,2,3,4,5];
將數(shù)組合并為字符串返回悍缠,默認(rèn)使用,連接
var str=arr.join();
在這里join的參數(shù)是字符串的連接符
?var str=arr.join("|");
""作為連接符,會(huì)將數(shù)組元素首尾相連成為字符串
var str=arr.join("");
重構(gòu)concat
?<script>
??????var?arr=[1,2,3,4,5,6];
??????var?arr1=[7,8,9]
??????merge()
??????function?merge(){
??????????//arr的長(zhǎng)度
????????var?q=arr.length
????????//arr1的長(zhǎng)度
????????var?w=arr.length
????????for(i=0;i<arr1.length;i++){
????????????//?在arr后面添加arr1的內(nèi)容
??????????arr[q+i]=arr1[i]
????????}
????????//返回長(zhǎng)度
????????return?m=q+w
??????}
??????console.log(arr,m)
????</script>
重構(gòu)join的方法
?var?arr?=?[1,?2,?3,?4,?5];
??????function?joins(arr,?separ)?{
????????if?(separ?===?undefined)?{
??????????separ?=?",";
????????}
????????var?str=""
????????for?(var?i?=?0;?i?<?arr.length?-?1;?i++)?{
??????????str?+=?arr[i]?+?separ;
????????}
????????str?+=?arr[i];
????????return?str;
??????}
??????var?str?=?joins(arr,?"|");
??????console.log(str);
toString可以直接將數(shù)組轉(zhuǎn)換為字符串
splice這個(gè)方法可以從指定的位置刪除給定數(shù)量的元素耐量,并且在這個(gè)位置插入需要的元素并且返回被刪除的元素組成的新數(shù)組
這個(gè)方法可以從指定的位置刪除給定數(shù)量的元素飞蚓,并且在這個(gè)位置插入需要的元素并且返回被刪除的元素組成的新數(shù)組
arr.splice(從什么位置開始,刪除多少個(gè)元素,要插入的元素);
沒有任何參數(shù)時(shí),返回一個(gè)空數(shù)組
var arr1=arr.splice();
第一個(gè)參數(shù)是0,表示從第0位開始廊蜒,第二個(gè)參數(shù)刪除多少個(gè)沒有填趴拧,意味著刪除到尾部
var arr1=arr.splice(0);//將所有數(shù)據(jù)轉(zhuǎn)移到新數(shù)組
從第0位開始刪除3個(gè)元素,返回到新數(shù)組arr1
var arr1=arr.splice(0,3);
從第幾位開始可以是負(fù)數(shù)山叮,從后向前數(shù)(倒數(shù)),因?yàn)闆]有給要?jiǎng)h除的數(shù)量著榴,因此刪除到尾部
var arr1=arr.splice(-2);
從數(shù)組的第0位開始,刪除1個(gè)元素屁倔,并且在這個(gè)位置插入一個(gè)元素 -1,替換
var arr1=arr.splice(0,1,-1);
數(shù)組的最后一位替換位0
var arr1=arr.splice(-1,1,0);
將數(shù)組中第二位開始兩位元素替換為10脑又,11
var arr1=arr.splice(2,2,10,11);
在數(shù)組的第二位插入一個(gè)元素-1
arr.splice(2,0,-1);
slice按指定位置截取復(fù)制數(shù)組的內(nèi)容
arr.slice(從什么位置開始,到什么位置之前結(jié)束)
第二個(gè)參數(shù)不寫锐借,默認(rèn)截取到尾部
只能從前向后截取
例:
var arr1=arr.slice();//復(fù)制數(shù)組arr
var arr1=arr.slice(0); //復(fù)制數(shù)組
var arr1=arr.slice(3);//從第三位截取到尾部復(fù)制
var arr1=arr.slice(-2);//從倒數(shù)第二位開始截取到尾部
var arr1=arr.slice(-3,-1);//從倒數(shù)第三位到倒數(shù)第一位