1.***數組:多個變量的集合,起了一個統一的名字 --用法
連續保存多個數據的引用類型的對象 --存儲
爲什麼要使用數組:
程序=算法+數據結構
好的數據結構。可以極大提高程序的執行效率
何時使用:程序中都是用數組集中管理多個數據
如何使用:創建 賦值 取值
1.創建:4種
1.創建空數組:var 數組名=[]; -->js中見到[],就是數組
2.創建數組同時,初始化數組中的每個元素:
var 數組名=[值1,值2,值3........];
內存中的數組名:引用類型的對象;每個值相當於一個元素;每個元素都有一個下標;
下標從0開始,每次增1,倒數個數-1
數組對象的個數:arr.length arr.length永遠等於最後一個下標+1
3.創建空數組:var 數組名=new Array(); -->([n]);
new:創建一個新對象
Array:數組類型
n:表示初始元素的個數,省略則創建空數組
4.創建數組同時初始化數組元素:
var 數組名=new Array(值1,值2 .....);
如何使用數組中每個元素:數組名[i]
數組名[i]的用法和普通的變量完全相同
2.賦值:
1.數組名[i]=值
2.不限制: --和其他語言最大的不同
1.不限制元素的個數:沒有數組越界錯誤,length自動增長爲最大下標+1
2.不限制元素的類型
3.取值:任何位置使用數組名[i],等效於直接使用數組名[i]中的值
數組是引用類型的對象:
原始類型的值,複製後,相互不影響
將數組中保存的數組對象的地址值,複製給另一個 ---引用類型
引用類型的對象,賦值後,依舊引用同一個對象,任何修改,都會影響對方
給一個數組賦值爲null,即爲釋放
null:主動釋放一個對象
垃圾回收器:專門釋放內存中不再被引用的對象的小程序,伴隨主程序執行;
每個對象都有一個引用計數器,增加引用+1,減少引用-1
一個對象,引用計數器爲0,不再被任何變量引用時,才能被回收
建議:使用完較大的對象後,都要主動釋放
數組的length屬性固定套路:2個
1.獲得最後一個元素值:arr[arr.lenght-1]
2.向數組末尾追加一個新元素:arr[arr.lenght]=新值
遍歷數組:依次對數組中每個元素執行相同操作
//三要素:
1.下標:i<數組長度
2.變量:下標i從0開始,每次++
for(var i=0;i<arr.length;i++){
當前元素:arr[i]
}
如何遍歷hash數組:
for(var key in hashArr){//反覆取出每個key放入
}
for in 結構也可以遍歷索引數組,但是無法控制開始和結束,默認從頭開始到尾部結束
今後:只要遍歷索引數組,選普通for循環;只要遍歷關聯數組,hash數組,只能用for in循環
筆試題:例1:
var chyx=[]; chyx["name"]="小籠包"; chyx["sx"]=81; chyx["yw"]=61; chyx["yy"]=89; var keys=[]; var i=0; for(keys[i++] in chyx);//獲取一個關聯數組所有的下標 console.log(keys);//name sx yw yy
例2:定義一個函數,找出一個整數中的最大值
/*定義一個函數,找出一個整數中的最大值*/ /*定義一個函數 getMax,接收一個數組對象參數arr * 將arr中第一個元素放入變量max * i從1開始遍歷arr中的元素的值 * 如果當前元素>max * 將當前元素存入max中 * 遍歷返回max*/ function getMax(arr){ var max=arr[0]; for(var i=1;i<arr.length;i++){ if(arr[i]>max){ max=arr[i]; } } return max } /*var arr=[4,6,2,5,9,7];*/ console.log(getMax([4,6,2,5,9,7]))
例3:定義函數,去掉數組中重複元素
/*定義函數,去掉數組中重複元素*/ /*定義函數delRepeat,接收一個數組arr*/ function delRepeat(arr){ //定義空數組hash //i從第一個元素開始遍歷arr中每個元素 // 將當前元素作爲key,加入hash中,值設置爲1 //(遍歷結束後)將arr重置爲空數組 //使用for in循環將hahs中每個key放入arr中 //返回arr var hash=[]; for(var i=0;i<arr.length;i++){ hash[arr[i]]=1; } arr=[]; i=0; for (arr[i++] in hash); return arr; } console.log(delRepeat(["a","a","d","v","v","r","f","a"]))
2.數組的API:瀏覽器廠商已經實現的方法;開發人員直接調用,不需要了解具體實現
將數組裝換爲字符串:2個
var str=arr.toString():返回數組中元素的內容,用逗號分隔
var str=arr.join("連接符"):***可自定義鏈接符***
固定套路:
1.無縫拼接數組每個元素:var str=arr.join("") --如果不加“ ”,等效於加;
2.將單詞拼接爲句子:var str=arr.join(" ");
3.將數組拼接爲html元素:案例:
var provs=["北京市","天津市","河北省"]; var html="<select><option>"+provs.join("</option>><option>")+"</option></select>";
優化:數組的拼接比字符串拼接效率更高!
建議:今後凡是頻繁的字符串拼接,都要2步:
1.先將要拼接的子字符串放入一個數組中
2.調用數組的join方法,一次性生成結果字符串
獲取數組字符串:toString()方法可以把數組轉換爲字符串,並返回結果
join([separator])返回一個字符串,由每個元素轉換而成的字符串使用指定的separator拼接而成
獲取子數組:var subArr=arr.slice(stari,endi+1);
starti:開始獲取的下標位置
endi:表示獲取到的小標位置
***含頭不含尾
slice方法支持倒數參數:其實負數下標不存在;假定的負數下標從-1開始
splice:刪除 插入 替換
1.刪除:arr.splice(starti,n) --從starti位置開始,刪除n個元素
2.插入:arr.splice(starti,0,新值1,新值2,....) --在starti位置插入新值1,新值2 ,原stari位置及其之後的元素,被 順移
3.替換:arr.splice(starti,n,新值1,新值2.....)
新元素的個數和n不一定相等
數組會自動調整元素的位置和長度
顛倒數組中所有元素的位置:arr.reverse();
強調:
var x=arr[i];//將arr[i],複製一份,改x,與arr[i],無關
3.數組的sort方法:arr.sort()
特點:默認按升序排列;默認一切都轉爲字符串,再按字符串比大小
自定義排序規則:2步:
1.定義比較器函數:專門比較任意兩值大小的函數
規定:兩個參數(a,b);
必須返回數字:如果a>b,就要返回正數
如果a<b,就要返回負數
如果a=b,就要返回0
//定義比較器函數 function compare(a,b){ /* return a-b;*/ return parseFloat(a)-parseFloat(b); }
2.將比較器函數對象作爲參數傳入sort方法中:
arr.sort(比較器函數對象函數名)
//定義比較器函數 function compare(a,b){ /* return a-b;*/ return parseFloat(a)-parseFloat(b); } arr.sort(compare); console.log(arr);
//函數作爲對象傳給別人用,不加()
冒泡排序:bubble --手寫級別
function bubble(arr,compare){ for(var r=1;r<=arr.length-1;r++){ for(var i=0;i<arr.length-r;i++){ if(compare(arr[i],arr[i+1])>0){ var temp=arr[i]; arr[i]=arr[i+1]; arr[i+1]=temp; } } } } function compare(a,b){ return parseFloat(a)-parseFloat(b); } var arr=['35px','12px','5px','123px']; bubble(arr,compare); console.log(arr);
函數 VS 方法:
1.都是function對象
2.不屬於任何對象的叫函數(不需要通過.訪問)
3.屬於特定對象的函數叫方法(需要通過對象,纔可以訪問)