JavaScript複習筆記(三)陣列及陣列API
一、陣列
分為兩種 關聯陣列:可以自己定義下標名稱的陣列
索引陣列:自動生成下標的陣列都是索引陣列
1、建立、賦值和取值
①建立:4種:
1. var 變數名=[]; 建立一個空陣列物件
2. var 變數名=[值1,值2,...](常用)建立陣列同時,為陣列指定初始元素(陣列中每個值)
陣列是引用型別的物件,變數中儲存了陣列物件的地址值
3. var arr=new Array(); 建立一個空陣列物件
new:建立一個新物件,並返回新物件地址,Array:js中的陣列型別
new Array()-->建立一個數組型別的新物件,並返回新物件的地址。
4. var arr=new Array(n);-->建立n個元素的陣列,new Array(值1,值2,...)
② 賦值:陣列變數[i]=新值;
找到陣列:使用變數等效於直接使用變數引用的陣列物件
陣列物件中,每個元素都有一個下標:每個元素的位置號,
下標從0開始,到元素個數-1結束
③ 取值: 陣列變數[i]
陣列變數[i]-->獲得i位置元素中的值
2、js陣列下標越界不會出錯!
為不存在的位置賦值:不會出錯!會自動建立指定下標的新元素。
從不存在的位置取值:不會出錯!也不會增加新元素,而是返回undefined
3、 .length屬性:陣列是物件,封裝了一組資料,並提供了對資料的操作方法
①常用方式 arr[arr.length-1]: 獲得任意長度陣列中的最後一個元素
arr[arr.length]=新值: 向陣列末尾追加一個新元素
改小length的值,可刪除末尾元素
②獲得陣列中的元素個數不一定等於實際的元素個數
例:var a=[];a[5]=5;console.log(a.length);console.log(a[2]);//輸出:6 undefined
實際只賦值一個元素,length卻為6,其餘未被賦值都為undefined
4、陣列遍歷:從下標0位置開始,依次取出每個元素,反覆執行相同的操作。
① 迴圈條件:下標i<arr.length②迴圈變數:下標i, 從0開始,每次增1,直到arr.length-1③ 迴圈體:xxx
例 var a=[1,1,2,3,5,8];
for(var i=0;i<a.length;i++){
console.log(a[i]);
} //輸出1 1 2 3 5 8
5、關聯陣列:可以自己定義下標名稱的陣列
①建立關聯陣列: var arr=[];
arr["key1"]=value1;
arr["key2"]=value2;
例 var SLP=[];
SLP["yanzhi"]=100
SLP["caihua"]=100
SLP["English"]=0
②如何訪問關聯陣列中的元素:arr["key"]
關聯陣列: 下標是不能重複的
優勢:精確定位某個下標的位置,不用遍歷
索引陣列:下標自動分配,無意義(常見)
缺點:要想按內容查詢元素,只能從頭開始遍歷!
③遍歷關聯陣列:依次遍歷arr中每個元素,將當前元素的下標存入key中
關聯陣列中的.length屬性失效!
for(var key in arr){
key; //得到當前元素的下標
arr[key]; //得到當前元素的值!
}
例:var SLP=[];
SLP["yanzhi"]=100;
SLP["caihua"]=100;
SLP["English"]=0;
for(var key in SLP){
console.log(key+":"+SLP[key]);
};
//結果: yanzhi:100 caihua:100 English:0
6、氣泡排序
var a=[7,16,8,6,15]
for(i=1;i<a.length;i++){
for(j=0;j<a.length-i;j++){
if(a[j]>a[j+1]){
max=a[j];
a[j]=a[j+1];
a[j+1]=max;
}}}
console.log(a);// [6, 7, 8, 15, 16]
7、陣列API:
①無法直接修改原物件,而返回新物件API(常考)
toString() join() concat() slice()
②陣列 to String:2種:
var str=arr.toString();-->輸出陣列中的內容,每個元素用逗號分隔
var str=arr.join("連線符")(常用)-->輸出陣列中的內容,自定義元素間連線符
使用的2種固定套路
1. 將字元組成單詞:arr.join("") //效果:abcd
2. 將單片語成句子:arr.join(" ") //效果:a b c d
③拼接:var newArr=arr.concat(另一個數組,值1,值2...)
例:a=[1,2,3,4];b=[7,8,9];
var c=a.concat(10,b);
console.log(a); //a不改變,說明不能直接修改原物件
console.log(c);
//輸出 [1, 2, 3, 4] [1, 2, 3, 4, 10, 7, 8, 9]
④擷取:var subArr=arr.slice(starti[,endi+1]);含頭不含尾,starti和endi代表陣列下標
第二個引數可以省略,代表一直擷取到結尾,引數可以取負值,負值從右數,從-1數起
例:var arr=[0,1,2,3,4,5,6];
console.log(arr.slice(0,3)); //輸出 [0, 1, 2],含頭不含尾
console.log(arr.slice(-1,-3)); //輸出 [] ,方向寫反了,無法從後向前擷取
console.log(arr.slice(-3,-1)); //輸出 [4, 5] ,取負數最後一位下標為-1,也含頭不含尾
⑤ splice: 刪除 、插入、替換(陣列最強大的API)
刪除:arr.splice(starti,刪除個數)
插入:arr.splice(starti,0,新值1,...)
替換:arr.splice(starti,刪除個數,新值1,...)
基本結構
arr.splice ( 3, 2, 21,22,23,24);
從第三位開始(含頭) 刪兩個 替換為21,22,23,24
例:arr=[11,12,13,14,15,16,17,18,19];
arr.splice (3,2,21,22,23,24);
console.log(arr);
//輸出 [11, 12, 13, 21, 22, 23, 24, 16, 17, 18, 19]
⑥ arr.reverse(); 顛倒陣列中所有元素
arr=[11,12,13,14,15,16,17,18,19];
console.log(arr.reverse()); // [19, 18, 17, 16, 15, 14, 13, 12, 11]
⑦arr.sort()按Unicode碼排序
例:var a=[1,12,4,46,3,35];
console.log(a.sort()); // [1, 12, 3, 35, 4, 46]
如何讓sort()方法按數值大小排序,定義一個比較器函式
function compare(a,b){return a-b}
例: var a=[1,12,4,46,3,35];
function compare(a,b){return a-b}
console.log(a.sort(compare)); //[1, 3, 4, 12, 35, 46]
8、棧和佇列:js中沒有真正的棧和佇列的型別,一切都是用陣列物件模擬的
一) 棧:只能從一端進出的陣列,另一端封閉 (FILO first in last out 先進後出)
① 末尾出入棧:已入棧元素的下標不再改變
入棧: arr.push(新值1,...)
出站: arr.pop()
var a=[1,12,4,46,3,35]; a.pop(); console.log(a); // [1, 12, 4, 46, 3]
var a=[1,12,4,46,3,35]; a.push(11,22); console.log(a); // [1, 12, 4, 46, 3, 35, 11, 22]
② 開頭出入棧:每次入棧新元素時,已入棧元素的位置都會向後順移。
入棧:arr.unshift(新值1,...);
出站:arr.shift();
var a=[1,12,4,46,3,35]; a.unshift(11,22); console.log(a); // [11, 22, 1, 12, 4, 46, 3, 35]
var a=[1,12,4,46,3,35]; a.shift(); console.log(a); // [12, 4, 46, 3, 35]
二) 佇列:只允許從末尾進入陣列,必須從開頭出陣列(FIFO first in first out 先進先出) 結尾入佇列:arr.push();
開頭出佇列:arr.shift();
9、二維陣列:陣列中的元素,又引用了另一個子陣列物件
① 使用二維陣列場景2種:
要儲存橫行豎列的二維資料
要儲存上下級關係的資料時
② 如何建立二維陣列2種:
1. 先建立空陣列,再賦值:
var arr=[];
arr[0]=["石家莊","保定","唐山"];
arr[1]=["德州","濟南","煙臺"];
2. 建立陣列時,同時初始化子陣列:
var data=[
[0,2,2,4], //第0行
[2,4,4,8], //第1行
[16,32,16,8], //第2行
[4,2,128,4] //第3行
];
如何訪問二維陣列中的資料:arr[行下標][列下標]
比如:data中第2行,第3個元素,data[1][2]
強調:二維陣列中,行下標不能越界!
console.log(data[1][5]); //undefined
console.log(data[5][1]); // Uncaught TypeError
③遍歷二維陣列:
固定套路:外層迴圈遍歷行,記憶體迴圈遍歷列
var arr=[[...],[...]...]
for(var r=0;r<arr.length;r++){
for(var c=0;c<arr[r].length;c++){
console.log(arr[r][c]);
}
}