JS中的數組

數組

1、數組的概念

先是用一個案例來表示:

案例1:計算5名同學的平均分

var a1,a2,a3,a4,a5;
a1 = Number(prompt("請輸入分數:"));
a2 = Number(prompt("請輸入分數:"));
a3 = Number(prompt("請輸入分數:"));
a4 = Number(prompt("請輸入分數:"));
a5 = Number(prompt("請輸入分數:"));
var ave = (a1+a2+a3+a4+a5)/5;
alert(ave);

這個程序很簡單,但是這還是5名同學的成績,但要是100人或者1000人呢,難道要真的複製100遍?這裏人數是和代碼量成正比的。但這樣要怎樣解決呢?第一反應當然使用循環,但是嘗試一下就會發現,循環使用不了,因爲無法控制變量a1,a2的值,也就是無法將循環控制變量和變量a1,a2聯繫起來。

那麼現在我們使用另一種方式來求這5名學生的成績平均分

案例2:

var a = [];
var sum = 0;
for(var i=0; i<10; i++){
    a[i] = Number(prompt("請輸入分數:"));
    sum += a[i];
}
var ave = sum/ a.length;
alert(ave);
這裏是利用數組來求值,這段代碼能夠實現跟案例1同樣的功能,而且是100人的話,只要把循環條件改爲i<100即可,整個程序的結構和代碼量和人數多少沒有關係。

那麼這裏爲什麼能和循環結合起來呢?因爲我們把變量的表示方式改變了,即名稱+序號的方式(a[0],a[1]······),那麼序號是可以用循環變量去控制的

2、數組的定義與元素訪問

要怎麼用?定義用三種方式:

(1)var a = []; 定義一個空的數組,一個一個往裏面加

(2)var a = new Array(); 定義一個數組對象

(3)var a = [0,0,0]; 定義數組內容的初始值

訪問元素:數組名+下標;如a[0]  a[3]

在數組中需要注意的是下標是從0開始的,而不是從1開始。同時在使用的時候需要注意的另一個問題就是越界問題,比如5個元素的數組,那麼它的下標範圍爲[0,4],而不包括5,要是輸出5就越界了。

數組是本質:一組變量的集合,或者說是一組內存單元。只不過對於變量的表示方式使用的是“數組名+下標”的方法。

3、數組的常用屬性和方法

3.1 數組的屬性

告訴我們數組的長度:數組名.length

案例1:計算學生成績平均分

var a = [];
var sum = 0;
for(var i=0; i<a.length; i++){
    a[i] = Number(prompt("請輸入分數:"));
    sum += a[i];
}
var ave = sum/ a.length;
alert(ave);
通過該屬性可以改變數組的長度,案例2:

var a = [];
var sum = 0;
a.length = 5;
for(var i=0; i<a.length; i++){
    a[i] = Number(prompt("請輸入分數:"));
    sum += a[i];
}
var ave = sum/ a.length;
alert(ave);

3.2 數組的常用方法

(1)unshift():在數組頭部添加元素

shift():刪除數組頭部的元素,返回值是刪除的頭部元素

(2)push:在數組的尾部插入元素,返回值爲改變後(添加元素後)數組的長度

pop:從數組的尾部刪除最後一個元素,返回值是被刪除的元素

var a = ["我","思","好","你","我","他"];
/*a[a.length] = "!";
a[a.length] = "?";*/
var b = a.push("說","你好");//在尾部添加元素
var c = a.pop("你好");//刪除數組最後的元素
alert(a);
alert(b);
alert(c);
(3)indexOf:查找在數組中重複出現的元素第一次出現的位置,它的返回值是該元素的下標;

lastIndexOf:查找在數組中重複出現的元素的最後一次出現的位置,返回值是該元素的下標。

var a = ["我","思","好","你","我","他"];
//    var b = a.indexOf("我");//查找第一個重複出現的元素
    var c = a.lastIndexOf("我");//查找重複出現的元素最後一次出現的位置
    alert(a);
    alert(c);
(4)slice(開始位置的下標,結束位置的下標):提取數組中指定的連續的子數組。概括起來就是前包括,後不包括(特點)

var a = ["我","思","好","你","我","他"];
var b = a.slice(2,4);
alert(b);
(5)splice:(開始刪除位置的下標,要刪除元素的長度,要選擇或者替換的內容),splice的含義是剪接,也就是有“加”有“減”,前兩個參數元素定義“剪”的部分,第三個參數定義“接”的部分,經過不同參數組合就可以實現以下三個功能:

①刪除操作:刪除數組中指定的任意元素

②插入操作:在數組中指定的位置插入元素

③替換操作:在數組中替換指定位置的元素(要被替換的被刪掉,輸入新元素)

/*數組的刪除、插入、替換*/
//刪除
var a = ["我","思","好","你","我","他"];
var b = a.splice(3,3);//指定要刪除的元素的下標和長度
alert(a);//輸出的結果爲:我,思,好
alert(b);//輸出的結果爲:你,我,他

//插入
var a = ["我","思","好"];
a.splice(3,0,"無所謂誰是誰非");
alert(a);

/*替換*/
var a = ["我","思","好"];
a.splice(2,2,"說","什麼");
alert(a);
(6)reverse:將數組中的元素反序輸出。在原數組的基礎上進行反序輸出,不會再創建一個新的數組

var a = [4,5,6,7,8,9];
 var b = a.reverse();
alert(a);
alert(b);//兩個輸出結果一樣
(7)map:原數組的映射,經過函數的加工,返回一個新數組

一般我們傳遞是參數都是數值、字符串等類型的數據,有些時候可能需要傳遞一個函數,那麼如何去傳遞一個函數呢?

案例:

var a = [2,4,6,8];
var b = a.map(fun);
alert(a);

function fun(value, index ,self){ 
    self[index] = value * value;
}
我們還可以將以上內容簡寫爲:

var a = [2,4,6,8];
var b = a.map(function(value, index ,self){//以前function後面總是跟着一個函數名,現在沒有是匿名函數
    self[index] = value * value;
});
alert(a);
這其實就是匿名函數。
案例:經過函數的加工,輸出一個新的數組

var a = [2,4,6,8];
var b = a.map(function(value, index ,self){
    self[index] = value * value;
});
alert(a);
上面的案例是用了三個參數,還可以使用一個參數的。

var a = [2,4,6,8];
var b = a.map(function(value){
    return value * value;
});
alert(a);
alert(b);
兩個程序輸出的結果都是一樣的。

4、for-in循環

這裏用兩個案例來說明:

案例1:寫一個數組,讓數組裏面的值相加

var sum = 0;
var array = [1,2,3,4,5,6];
array[10] = 10;
//alert(array);
for(var i=0; i<array.length; i++){
    alert(array[i]);
    sum += array[i];//所有的數相加
}
alert(sum);
上面使用了for循環,下面使用for-in循環

var sum = 0;
var array = [1,2,3,4,5,6];
array[10] = 10;
//alert(array);

for(var j=0 in array){
    //alert(array[j]);
    sum += array[j];
}
alert(sum);
其實這兩個輸出的結果是一樣的,但是雖然結果一樣,但是for循環會把所有的值都加上,for-in循環只是有那個數就加上那個數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章