JavaScript令人焦灼的“數組”


0.前言

??最近看到有關數組方面的知識,我也真是醉了,特在此做一些總結,就當一個筆記,希望在往后的日子里,遇到相同的問題是能夠及時解決。

  • 認識數組;
  • 創建數組;
  • 數組元素的訪問(賦值與取值);
  • 數組的遍歷;
  • 數組長度length、元素的更新、增加和刪除;
  • 數組中常用的方法;
  • 數組排序;
  • 數組的數組(多維數組);

1.認識數組

所謂數組,就是相同數據類型的元素按一定順序排列的集合,就是把有限個類型相同的變量用一個名字命名,然后用編號區分他們的變量的集合,這個名字稱為數組名,編號稱為下標。組成數組的各個變量稱為數組的分量,也稱為數組的元素,有時也稱為下標變量。數組是在程序設計中,為了處理方便, 把具有相同類型的若干變量按有序的形式組織起來的一種形式。這些按序排列的同類數據元素的集合稱為數組。

<strong>擴展:</strong>內置對象是JS語言自帶對象,提供了一些基本的功能,供開發者來使用。瀏覽器上跑的內置對象Math,String,Array,Date等對象
對象:屬性(變量)和方法(函數)的集合,數組就是對象,可以存儲多個不同類型的數據

2.創建數組

??創建數組有常用的兩種方法:
<strong>第一種方法:構造函數法</strong>
?1.1、使用構造函數創建空數組
var arr1(棧區) = new Array()(堆區)
注解:new的解釋如下:

內存關系.png

(1)棧區:基本數據類型(變量)保存在棧區,會根據函數的結束而自動釋放
(2)堆區:在堆區開辟出一片內存空間存放對象,需要程序員手動開辟,并且需要手動釋放。
(3)返回堆區對象的引用(地址)
<strong>注意:</strong>arr1不是數組,是數組的引用,就是為了訪問堆區的數組對象
1.2、使用構造函數創建確定容量的數組
var arr2 = new Array(10);
1.3、使用構造函數創建一個擁有一些數據的數組*
var arr3 = new Array(1,2,"Tome",true);
<strong>第二種方法:字面量法創建數組</strong>
2.1、使用字面量法創建空數組
var arr4 = [];
[]:表示數組。
2.2、使用字面量法創建一個擁有一些數據的數組
var arr5 = [1,2,3,4,"adh",true];
注:數據直接寫在中括號里面,數據之間用逗號分開

3.數組元素的訪問(賦值與取值)

數組的格式: 數組名[下標]
注意:下標是從“0”開始的,訪問如下:

var arr = new Array(5);
        arr[0] = 18;
        arr[1] = 19;
        arr[2] = 20;
        arr[3] = 21;
        arr[4] = 22;
        console.log(arr);
        console.log(typeof arr);
        //取值(取某一個元素的值)
        console.log(typeof arr[0]);

4.數組的遍歷

數組遍歷的常用方法:
<strong>(1)for循環遍歷</strong>

var arr = [1,2,3,4,5];
        var sum = 0;
        for (var i = 0; i < arr.length; i++) {
            var num = arr[i];
            sum += num;
            console.log(num);
        }
            console.log(sum);

<strong>(2)for-in 快速遍歷</strong>

for(var j in arr){
     console.log(arr[j]);
}

注意:“in”的前面的“j”針對數組來說是我們的下標
(3)forEach();是MCMAScript5.0加入的,低版本IE不能用的。

arr.forEach(function(e){
            console.log(e);
        });

注意:e是數組里面的每一個元素。

5.數組長度length、元素的更新、增加和刪除

什么是數組的長度?
??就是數組元素的個數。
用<strong>length</strong>表示數組的長度。

var arr = [1,2,3,4,5];
        arr["name"] = "sunck";
        console.log(arr.length);
        console.log(arr);

運行結果:

1.PNG

課件數組的長度還是為5,加了字符串元素,并沒有將長度算進去,這是因為<strong>length不計算非正規(數字)下標</strong>。那么問題來了,在for-in里面length是否計算非數字的長度呢?

for (var i in arr) {
            console.log(i);
        }

1.PNG

綜上所述:length在for-in中可以遍歷


<strong>undefined的情況</strong>

arr.length = 10;
        console.log(arr.length);
        console.log(arr);
        console.log(arr[5]);
        console.log(arr[6]);
        console.log(arr[7]);
        console.log(arr[8]);
        console.log(arr[9]);

運行結果:

1.PNG

因為arr的原本數組長度為5,現在給他設置為10,但是剩余空出來的位置就會變成undefined。

<strong>數組長度的減少,多余的刪除</strong>

arr.length = 3;
        console.log(arr.length);
        console.log(arr);

運行結果:

1.PNG

這是因為,本來給他設定的長度為10,現在又給他設置為3,就會裝不下數據,所以多出來的數據就會刪除掉。


<strong>添加的下表緊挨著以前最后的下標</strong>

arr[3] = 100;
        console.log(arr.length);
        console.log(arr);

運行的結果:

1.PNG

可以看到,所添加的元素,會緊跟著,最后一個正規數字元素的后面。


<strong>添加的下標距離最后的下標有一定的距離,那么中間的元素默認undefined</strong>

arr[6] = 600;
        console.log(arr.length);
        console.log(arr);
        console.log(arr[4]);
        console.log(arr[5]);

運行結果:

1.PNG

<strong>刪除</strong>

delete arr[2];
        console.log(arr.length);
        console.log(arr);

運行結果:

1.PNG

注意:我們用delete操作符來刪除指定的元素,數組的長度不會改變,只是對應的將值刪除為undefined


6.數組中常用的方法

<strong>(1)push(item1,item2,...)</strong>
<strong>功能:</strong>在數組的末尾添加一個或者多個元素
<strong>參數:</strong>要添加的元素
<strong>返回值:</strong>添加數據后數組的長度

var arr1 = [1,2,3,4,5];
        var ret1 = arr1.push(9,10,23);
        console.log(arr1);
        console.log(arr1.length);
        console.log(ret1);

<strong>(2)unshift(item1,item2,...)</strong>
<strong>功能:</strong>在數組的頭添加一個或者多個元素
<strong>參數:</strong>要添加的元素
<strong>返回值:</strong>添加數據后數組的長度

var arr2 = [1,2,3,4,5];
        var ret2 = arr2.unshift(0);
        console.log(arr2);
        console.log(arr2.length);
        console.log(ret2);

<strong>(3)pop()</strong>
<strong>功能:</strong>在數組的末尾刪除一個元素
<strong>參數:</strong>無
<strong>返回值:</strong>被刪除的元素

var arr3 = [1,2,3,4,9];
        var ret3 = arr3.pop();
        console.log(arr3);
        console.log(arr3.length);
        console.log(ret3);

<strong>(4)shift()</strong>
<strong>功能:</strong>在數組的頭刪除一個元素
<strong>參數:</strong>無
<strong>返回值:</strong>被刪除的元素

var arr4 = [1,2,3,4,5];
        var ret4 = arr4.shift();
        console.log(arr4);
        console.log(arr4.length);
        console.log(ret4);

<strong>(5)join(str)</strong>
<strong>功能:</strong>將數組的元素用參數字符串拼接成一個新的字符串
<strong>參數:</strong>一個字符串
<strong>返回值:</strong>拼接的結果字符串

var arr5 = [1,2,3,4,5];
        var ret5 = arr5.join("good");
        console.log(arr5);
        console.log(arr5.length);
        console.log(ret5);
        console.log(typeof ret5);

<strong>(6)reverse()</strong>
<strong>功能:</strong>倒置數組
<strong>參數:</strong>無
<strong>返回值:</strong>倒置以后的數組

var arr6 = [1,2,3,4,5];
        var ret6 = arr6.reverse();
        console.log(arr6);
        console.log(arr6.length);
        console.log(ret6);
        console.log(typeof ret6);

<strong>(7)slice(startIndex,endIndex)</strong>
<strong>功能:</strong>在數組中從startIndex下標開始一直截取到endIndex下標之前
<strong>參數:</strong>開始與結束的下標
<strong>返回值:</strong>截取的數據數組

var arr7 = [1,2,3,4,5,6,7,8,9,10];
        var ret7 = arr7.slice(3,7);
        console.log(arr7);
        console.log(ret7);

<strong>(8)splice(下標,個數,item1,item2...)</strong>
<strong>功能:</strong>是在數組的中間添加或者刪除一些元素
<strong>必選參數:</strong>下標、個數
<strong>可選參數:</strong>item1,item2...
<strong>返回值:</strong>
添加:個數為0,從下標處開始添加可選參數中的元素
注意:如果下標大于了原數組的最大的下標,都是在數組最后添加元素

var arr9 = [1,2,3,4,5];//1,2,8,9,3,4,5
        var ret9 = arr9.splice(7, 0, 8, 9);
        console.log(arr9);
        console.log(arr9.length);
        console.log(ret9);
        console.log(ret9.length);

刪除:不需要可選參數,從下標開始刪除對應個數個元素
返回值:刪除的元素數組

var arr10 = [1,2,3,4,5,6,7,8,9,10];
        var ret10 = arr10.splice(2, 6);
        console.log(arr10);
        console.log(arr10.length);
        console.log(ret10);
        console.log(ret10.length);

<strong>(9)concat(arr1, arr2...)</strong>
<strong>功能:</strong>將多個數組拼接成一個數組
<strong>參數:</strong>一個或者多個數組
<strong>返回值:</strong>拼接之后新的數組,新的數組的元素是所有數組的元素

var arr8 = [1,2,3];
        var num8 = [4,5,6];
        var str8 = [7,8,9];
        var ret8 = num8.concat(arr8, str8);
        console.log(ret8);
        console.log(arr8);
        console.log(num8);
        console.log(str8);

<strong>(10)indexOf(item)</strong>
<strong>功能:</strong>從數組的左側開始查找對應第一次出現的參數元素的下標
<strong>參數:</strong>元素值
<strong>返回值:</strong>如果找到了對應的元素則返回該元素的下標值,否則返回-1

var arr11 = [1,2,3,3,4,5,3,7,8];
        var ret11 = arr11.indexOf(9);
        console.log(ret11);
        console.log(arr11);

<strong>(11)lastIndexOf(item)</strong>
<strong>功能:</strong>從數組的右側開始查找對應第一次出現的參數元素的下標
<strong>參數:</strong>元素值
<strong>返回值:</strong>如果找到了對應的元素則返回該元素的下標值,否則返回-1

var arr12 = [1,2,3,3,4,5,3,7,8];
        var ret12 = arr12.lastIndexOf(3);
        console.log(ret12);
        console.log(arr12);

7.數組排序

<strong>(1)冒泡排序</strong>
原理:

54321->45321->43521->43251->43215      4
                0 1    1 2    2 3    3 4
        43215->34215->32415->32145             3
                0 1    1 2    2 3    
        32145->23145->21345                    2
                0 1    1 2
        21345->12345                           1
                0 1
var arr = [4,5,3,1,2];

        //                   數組元素個數-1
        for (var i = 0; i < arr.length - 1; i++) {
            //                  數組元素個數-1-i
            for (var j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] <= arr[j + 1]) {
                    var temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        console.log(arr);

<strong>(2)sort排序</strong>
注意:sort默認升序排序

var str = [4,5,3,1,2];
        str.sort();
        console.log(str);

如果要排降序,必須給出排序的標準,排序的標準是一個函數。

str.sort(compare);
        function compare(v1, v2) {
            if (v1 < v2) {
                return 1;
            }
            return -1;
        }
        console.log(str);

8.數組的數組(多維數組)

/**
         * 多維數組:數組的元素是數組
         */
        
        var a = [1,2,3];
        var b = [4,5,6];
        var c = [7,8,9];

        var arr = [a,b,c];

        console.log(arr);
        console.log(arr[1][2]);

9.總結

??數組的總結,就這么多了,如果有其他要補充的,歡迎來信。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容