1. 程式人生 > 其它 >JS學習筆記-陣列

JS學習筆記-陣列

技術標籤:三週學習JSjavascript

一、陣列(Array)

  1. 陣列也是一個物件
  2. 它和普通物件的功能類似,也是用來儲存一些值。
  3. 不同的是普通物件是使用字串來作為屬性名的,而陣列是使用數字來作為索引操作元素。
  4. 索引:從0開始的整數
  5. 陣列的儲存效能比普通物件要好,在開發中我們經常使用陣列來儲存一些資料。

二、建立陣列物件

  1. 使用typeof檢查一個數組時,返回object
var  arr=new Array();

7. 向陣列中新增元素

語法:陣列[索引] =值

var  arr=new Array();
arr[0]=10;

8. 讀取陣列中的元素

語法: 陣列[索引]
如果讀取不存在的索引,返回undefined

9. 獲取陣列的長度,length

語法:陣列.length
(1)對於連續的陣列,使用length可以獲取陣列的長度(元素的個數);
(2) 對於非連續的陣列,使用length會獲取到陣列的最大的索引+1
(3)儘量不要建立非連續的陣列

10. 修改length

(1)如果修改length大於原長度,則多出部分會空出來
(2)如果小於原長度,則多出的元素就會被刪除。所以可以通過修改length來刪除一些元素。

11.向陣列的最後一個位置加元素

語法:陣列[陣列.length]=值

三、陣列字面量

1. 使用字面量來建立陣列

語法:var arr =[]
2.使用字面量建立陣列時,可以在建立時就指定陣列中的元素。

var arr=[1,2,3,4,5]//索引為1的值是1....

2. 使用建構函式建立陣列時

也可以同時新增元素,將要新增的元素作為建構函式的引數傳遞,元素之間用逗號隔開。

var arr2=new Array(10,20,30)

3. 建立一個數組,陣列中只有一個元素10

var arr=[10]

4. 建立一個長度為10的陣列

arr2=new Array(10)

5.陣列中的元素可以是任意的資料型別

可以是一個物件

var arr=[10,20]
var obj={name:"小per"};
arr[arr.length]=obj;
console.log(arr);
//輸出結果:10,20,{name:"小per"}
console.log(arr[2].name);//小per

也可以是一個函式

arr=[function(){alert(1)}];

陣列中也可以放陣列,二維陣列

arr=[[1,2],[2,3]]

四、陣列的方法

1. push()方法

(1)該方法可以向陣列的末尾新增一個或多個元素,並返回陣列的新的長度,可以將要新增的元素作為方法的引數傳遞,這樣這些元素將會自動新增到陣列的末尾。
語法:陣列.push(“值”,“值”);
(2)該方法會將陣列新的長度作為返回值返回。

2. pop()方法

(1)該方法可以刪除該陣列的最後一個元素,並將刪除的元素作為返回值返回。
語法:陣列.pop()

3. unshift()方法

(1)向陣列的開頭新增一個或多個元素,並返回新的陣列長度
語法:陣列.unshift(“值”)
(2)向前邊加入元素之後,其他元素的索引會依次調整

4.shift()方法

(1)可以刪除陣列的第一個元素,並將被刪除的元素作為返回值返回
語法:陣列.shift()

5.slice()方法

(1)可以從陣列中提取指定元素
(2)該方法不會改變原陣列,而是將擷取到的元素封裝到一個新陣列中返回。
(3)引數:
1.擷取開始的位置的索引,包含開頭索引
2.擷取結束的位置的索引,不包括結束索引
3.第二個引數可以不寫,此時會擷取從開始索引往後的所有元素

var arr=["孫悟空","豬八戒","沙和尚","唐僧","白龍馬"];
arr.slice(0,2);//擷取索引0-2的元素

(4)索引可以傳遞一個負值,如果傳遞一個負值,則從後往前計算,-1倒數第一個,-2倒數第二個

6.splice()方法

(1)可以用來刪除陣列中的指定元素
(2)使用splice()會影響到原陣列,會將指定元素從原陣列中刪除,並將被刪除的元素作為返回值返回
(3)引數:splice(第一個引數,第二個引數,新增的元素1,新增的元素2)
1.擷取開始的位置的索引,包含開頭索引
2.刪除的數量
第三及以後:可以傳遞一些新的元素,這些元素將會自動插入到刪除開始位置索引的前邊

7.concat()方法

(1)concat()可以連線兩個或多個數組,並將新的陣列返回。還可以傳元素
(2)語法:陣列1.concat(陣列2);
(3)該方法不會對原陣列產生影響,是返回的結果是連線起來的陣列。

8.join()方法

(1)該方法可以將陣列轉換成一個字串
(2)該方法不會對原陣列產生影響,而是將轉換後的字串作為結果返回。返回結果的型別是字串型
(3)在join()中可以指定一個字串作為引數,這個字串將會成為陣列中元素的連線符。不寫則預設連線符的是逗號。

9.reverse()方法

(1)該方法用來反轉陣列(前邊的去後邊,後邊的去前邊)
(2)該方法會直接修改原陣列

10.sort()方法

(1)可以對陣列的元素進行排序
(2)會影響原陣列,預設按照Unicode編碼排序。
(3)即使對於純數字的陣列,使用sort()排序時,也會按照unicode編碼來排序。所以對數字進行排序時,可能會得到錯誤的結果。
(4)可以自己指定排序的規則,我們可以在sort()新增一個回撥函式,來指定排序規則。
回撥函式需要定義兩個形參,瀏覽器會分別使用陣列中的元素作為實參去呼叫回撥函式。
使用哪個元素呼叫不確定,但是肯定是在陣列中a一定在b前邊
(5)瀏覽器會根據回撥函式的返回值來決定元素的順序,如果返回一個大於0的值,則元素會交換位置。如果返回小於0的值,則元素位置不變。如果返回一個0,則認為兩個元素相等,也不交換位置
(6)如果需要升序排列,則返回a-b,需要降序排列,則返回b-a。

arr[5,4];
arr.sort(function(a,b){
  //前邊的大
 /* if(a>b){
    return 1;
}else if(a<b){
   return -1;
}else{
   return 0;
}*/
//升序排列
return a-b;
//降序排序
return b-a;

})

五、陣列的遍歷

  1. 所謂遍歷陣列,就是將陣列中的元素都取出來
for(var i=0;i<arr.length;i++){
    console.log(arr[i]);
}

六、例題

function Person(name,age){
							this.name=name;
							this.age=age;
							
						}
						var per=new Person("孫悟空",18);
						var per2=new Person("豬八戒",28);
						var per3=new Person("紅孩兒",8);
						var per4=new Person("蜘蛛精",17);
						var per5=new Person("沙和尚",38);
						
						var perArr=[per,per2,per3,per4,per5];
						 function fun(arr){
							 //建立一個新陣列
							var newArr=[];
							 for(var i=0;i<arr.length;i++){
								//判斷Person的年齡是否大於等於18
								if(arr[i].age>=18){
									//將物件放入到新陣列中
									newArr.push(arr[i]);
							} 
						} 
						//將新的陣列返回
						return newArr;
						}
						var result=fun(perArr);
						console.log(result);
var arr=[1,2,3,2,1,3,4,2,5]
		//去除陣列中重複的數字
		for(var i=0;i<arr.length;i++){
			//獲取當前元素後的所有元素
			for(var j=i+1;j<arr.length;j++){
				//判斷兩個元素是否相等
				 if(arr[i]==arr[j]){
					 //如果相等則證明出現了重複的元素,則刪除j對應的元素
					arr.splice(j,1);
					//當刪除了當前j所在的元素以後,後邊的會自動補位
					//此時將不會在比較這個元素,需要再比較一次j所在位置的元素
					j--;
				} 
				
			}
		}

七、forEach()方法

  1. 一般我們都是使用for迴圈去遍歷陣列,JS中還為我們提供了一個方法,用來遍歷陣列forEach(),這個方法只支援IE8以上的瀏覽器。IE8及以下瀏覽器不支援該方法。
  2. forEach()方法需要一個函式作為引數。像這種函式,由我們建立但是不由我們呼叫的,我們稱為回撥函式。
  3. 陣列中有幾個元素就會執行幾次,每次執行時,瀏覽器就會將遍歷到的元素以實參的形式傳遞進來,我們可以定義形參,來讀取這些內容。
  4. 瀏覽器會在回撥函式中傳遞三個引數:
    (1)第一個引數:當前正在遍歷的元素value
    (2)第二個引數:就是當前正在遍歷元素的索引index
    (3)第三個引數:正在遍歷的陣列obj
arr.forEach(function(value,index,obj){

});

八、call和apply方法

1.這兩個方法都是函式物件的方法,需要通過函式物件來呼叫。
2.當對函式呼叫call()和apply()都會呼叫函式執行。
3.在呼叫call和apply可以將一個物件指定為第一個引數,此時這個物件將會成為函式執行時的this。

function(){
 alert(this);
}
var obj={};
fun.apply(obj);//{}
	var obj={
			name:"孫悟空",
			sayName:function(){
				alert(this.name);
							}
			};
			var obj2={
				name:"obj2",
				};
	      obj.sayName.apply(obj2);//引數是誰誰,this就是誰
  1. call()方法可以將實參在物件之後一次傳遞。apply()方法需要將實參封裝到一個數組中統一傳遞。
function fun(a,b){
		 console.log("a="+a);
		 console.log("b="+b);
		}
		var obj={
			name:"孫悟空",
			sayName:function(){
				alert(this.name);
							}
			};
			var obj2={
				name:"obj2",
				};
	      fun.call(obj,2,3);
	      fun.call(obj,[2,3]);

九、arguments

  1. 在呼叫函式時,瀏覽器每次都會傳遞進兩個隱含的引數。
    函式的上下文物件 this
    封裝實參的物件 arguments
  2. arguments是一個類陣列物件,它也可以通過索引來操作資料,也可以獲取長度,在呼叫函式時,我們所傳遞的實參都會封裝到arguments中儲存。
  3. 檢查·arguments是否是一個數組
arguments instanceof Array;//檢查arguments是否是Array類的例項
Array.isArray(arguments);
  1. arguments的length可以用來獲取實參的長度。有幾個實參,長度就是幾
  2. 即使不定義形參,也可以通過arguments來使用實參,只不過比較麻煩。
    arguments[0] 表示第一個實參
    arguments[1] 表示第二個實參
  3. arguments有一個callee屬性,這個屬性對應的是一個當前正在執行的函式物件。