淺析JavaScript之數組

 一  概述java

     JavaScript數組同後端語言同樣,具備它本身的數據結構,歸根結底,這種數據結構,本質就是一種集合。算法

     在後端語言中(如java,.net等),數組是這樣定義的:數組是用來存儲相同數據類型的集合。這個定義,「相同數據類型」6個字限制了數據只能存儲相同的數據類型,如int[]數組只能存儲數字,而不能存儲字符串,以下定義方式,是錯誤的,由於string後端

不屬於整型數組

int[] arr = { 10, 20,"string" };

   然而,在JavaScript中,數組的定義倒是很是寬鬆的,這也決定了其能存儲一切數據的特色。JavaScript數組具備以下特色數據結構

   特色1:存儲相同基本數據類型的數據;函數

   特色2:存儲不一樣基本數據類型的數據;spa

   特色3:存儲對象.net

   這三個特色,咱們可歸結爲一句話:JavaScript存儲一切對象,而不像後端語言那樣,只能存儲相同數據類型。除此以外,JavaScript數組還提供了不少豐富的操做方法。以下爲經常使用的操做方法。設計

 本篇文章將主要結合代碼來論述JavaScript數組。code

二  對數組的基本操做

(一)建立數組

第一種方式:構造函數方式

   //第一種建立數組的方式:構造函數方式
    var colors = new Array();//未知數組長度
    //var colors = new Array(4);//已知數組長度
    //var colors = new Array('green', 'yellow', 'white', 'red');//建立數組同時,給數組賦值
    //var colors = Array();//在建立時,能夠省略new關鍵字

第二種方式:字面量方式

   //第二種建立數組方式:使用數組字面量
    var colors = ['green', 'yellow', 'white', 'red'];
    var name = [];//建立空數組

(二)訪問數組

訪問數組,經過數組的下標來訪問

   //建立數組
    var colors = ['green', 'yellow', 'white', 'red'];
    //輸出索引值
    for (var i = 0; i < colors.length; i++) {
        alert(colors[i]);//green,yellow,white,red
    }

提示:for...in...訪問數組屬性(索引),而不是數組屬性值

    //建立數組
    var colors = ['green', 'yellow', 'white', 'red'];
    //輸出數組索引
    for (var propAttr in colors) {
        alert(propAttr);//0,1,2,3
    }

(三)爲數組添加元素

第一種方式:棧方式(後進先出,從數組尾部加入數據)

   //建立數組
    var colors = ['green', 'yellow', 'white', 'red'];
    //第一種方式:棧方式
    colors.push("orange");
    for (var i = 0; i < colors.length; i++) {
        alert(colors[i]);//green,yellow,white,red,orange
    }

第二種方式:隊列方式(先進先出,從數組頭部加入數據)

var colors = ['green', 'yellow', 'white', 'red'];
colors.unshift('orange');
    for (var i = 0; i < colors.length; i++) {
        alert(colors[i]);//orange,green,yellow,white,red
    }

(四)移除數組元素

第一種方式:棧方式(後進先出,從數組尾部移除數據)

    //建立數組
    var colors = ['green', 'yellow', 'white', 'red'];
    //從尾部彈出數據
    colors.pop();
    for (var i = 0; i < colors.length; i++) {
        alert(colors[i]);//green,yellow,white
    }

第二種方式:隊列方式(先進先出,從數據頭部移除數據)

   //建立數組
    var colors = ['green', 'yellow', 'white', 'red'];
    //從頭部移除數據
    colors.shift();
    for (var i = 0; i < colors.length; i++) {
        alert(colors[i]);//yellow,white,red
    }

第三種方式:length方式(藉助length屬性可訪問性來操做)

    //建立數組
    var colors = ['green', 'yellow', 'white', 'red'];
    //從尾部移除數據,與pop()同樣
    colors.length = 3;
    for (var i = 0; i < colors.length; i++) {
        alert(colors[i]);//green,yellow,white
    }

三  數組方法

(一)檢測方法

數組檢測方式,可經過typeof,instranceof和Array.isArray()來檢測。

(二)轉換方法

全部對象都具備toLocaleString(),toString()和valueOf()三個方法,數組也如此。

1.toString()

toString()將數據的每一個屬性值轉化爲對應的字符串,而後再輸出轉換後的字符串值。

    var colors = ['red','green','yellow'];
    alert(colors.toString());//red,green,yellow

而下列代碼與如上代碼是同樣的,由於alert()接收的是字符串,因此會在後臺調用toString()方法

    var colors = ['red','green','yellow'];
    alert(colors);//red,green,yellow

2.valueOf()

valueOf()方法同toString()方法同樣,也是返回數組的字符串

    var colors = ['red', 'green', 'yellow'];
    alert(colors.valueOf());//red,green,yellow

3.toLocaleString()

toLocaleString()返回數組的字符串形式。

    var colors = ['red', 'green', 'yellow'];
    alert(colors.toLocaleString());//red,green,yellow

4 三者之間關係

關係1:當不顯示指出調用哪一個方法時(toString(),toLocaleString()和valueOf()),默認調用每一個屬性的toString();

關係2:當顯示地指出調用哪一個方法時,就調用每一個屬性的該方法;

關係3:關於valueOf問題,暫留

   var person1 = {
        toString: function () {
            return "Alan";
        },
        toLocaleString: function () {
            return "Alan_beijing";
        },
        valueOf: function () {
            return "valueOf1";
        }
    };

    var person2 = {
        toString: function () {
            return "Alan1";
        },
        toLocaleString: function () {
            return "Alan_beijing1";
        }
    }

    var people = [person1, person2];
    alert(people.toString());//Alan,Alan1
    alert(people.toLocaleString());//Alan_beijing,Alan_beijing1
    alert(people.valueOf());//Alan,Alan1
    alert(people);//Alan,Alan1

(三)棧方法

棧是一種數據結構,其算法爲:LIFO(Last input First out)後進先出,其兩個核心方法爲push()和pop();

1.push()

push()表示將數據壓入棧中,且放在棧的最後位置,即從棧的尾部壓入數據。對於數組,則在數組的尾部加入數據,操做的順序爲:先把數組length+1,再壓入數據。

    var arr = [10, 20, 30];
    arr.push('新加入的數據');
    alert(arr.toString());//10,20,30,新加入的數據

2.pop()

push()表示將數據從棧中彈出,且從棧的最後位置彈出。對於數組,則在數組的尾部彈出數據,操做的順序爲:先彈出數據,再數組length-1

    var arr = [10, 20, 30];
    arr.pop();
    alert(arr.toString());//10,20

(四)隊列

隊列是一種數據結構,其算法爲:FIFO(First input First out)後進先出,其兩個核心方法爲unshift()()和shift();

1.unshift()

unshift()表示從隊列頭部加入數據。對於數組,則從數組索引最小位置加入數據,操做順序爲:先將數length+1,再將當前數組屬性值日後移動1個位置,最後將新數據添加到索引0處。

    var arr = [10, 20, 30];
    arr.unshift(40);
    alert(arr.toString());//40,10,20,30

2.shift()

shift()表示從隊列頭部移除數據。對於數組,則從數組索引最小位置移除數據。

    var arr = [20, 30];
    arr.shift();
    alert(arr.toString());//30

(五)排序方法

在js數組中,兩個重要的重排序方法:reverse()和sort()

1.reverse()

reverse(),顧名思義,逆序方法。

    var arr = [1,2,3,4,5];
    alert(arr.reverse());//5,4,3,2,1

2.sort()

sort()是比較靈活的排序方法了,支持自定義排序規則,默認排序爲升序

默認爲升序

    var arr = [3, 1, 2, 5, 4];
    alert(arr.sort());//1,2,3,4,5

自定義排序規則

    var arr = [3, 1, 2, 5, 4];
    alert(arr.sort(Compare));//1,2,3,4,5
    //自定義排序規則:正序
    function Compare(value1, value2) {
        if (value1 > value2) {
            return 1;
        } else if (value1 < value2) {
            return -1;
        } else {
            return 0;
        }
    }

 (六)位置方法

js數組提供了兩個位置方法:indexof()和lastIndexOf()

indexOf()表示首次知足條件的位置;而lastIndexOf()則表示最後知足條件的位置

    var arr = [20, 30,20,40,10];
    alert(arr.indexOf(20)); //0
    alert(arr.lastIndexOf(20));//2

(七)迭代方法

ECMAScript5提供了5個迭代方法:every(),filter(),forEach(),map()和some()

這個五個方法,均接收2個參數。

1.every()

對數組中的每項運行給定函數,若是該函數對每一項都返回ture,則返回true,不然返回false.

    //every
    var num = [1, 2, 3, 4, 5, 4, 3, 2, 1];
    var everyResult = num.every(function (item, index,array) {
        return item>2
    });

    alert(everyResult);//fasle

2.some

對數組中的每項運行給定函數,若是該函數對任意一項返回ture,則返回true,不然返回false

    //some
    var num = [1, 2, 3, 4, 5, 4, 3, 2, 1];
    var someResult = num.some(function (item, index, array) {
        return item > 2;
    });

    alert(someResult);//true

3.filter

對數組中的每項運行給定函數,返回該函數會返回true的項組成的數組

    //filter
    var num = [1, 2, 3, 4, 5, 4, 3, 2, 1];
    var filterResult = num.filter(function (item, index, array) {
        return item > 2;
    });

    alert(filterResult);//3,4,5,4,3

4.map

對數組中的每項運行給定函數,返回每次函數調用的結果組成的數組

    //map
    var num = [1, 2, 3, 4, 5, 4, 3, 2, 1];
    var mapResult = num.map(function (item, index, array) {
        return item * 2;
    });

    alert(mapResult);//2,4,6,8,10,8,6,4,2

 

5.forEach

對數組中的每項運行給定函數。注意,該方法沒返回值

    //forEach
    num.forEach(function (item, index, array) {
        //執行想要執行的操做
    });

(八)求和方法

ECMAScript提供了2個縮減方法:reduce()和reduceRight()

reduce和reduceRight,至關於.net的斐波拉列數列,計算算法爲:f(n)=f(n-1)+f(n-2);

1.reduce

reduce計算數組時,按照從左到右的順序

    var values = [1, 2, 3, 4, 5];
    var sum = values.reduce(function (prev, cur, index, array) {
        return prev + cur;
    });

    alert(sum);//15

2.reduceRight

reduceTight計算數組時,從右到左順序

    var values = [1, 2, 3, 4, 5];

    var sum1 = values.reduceRight(function (prev, cur, index, array) {
        return prev + cur;
    });

    alert(sum1);//15

 

(九)其餘方法

ECMAScript爲數組操做提供了不少方法,如concat()和slice()

1.concat()

concat()方法是將兩個對象合併,從而生成新對象,合併同時,不會改變原來對象的值,只是作簡單的拷貝

    var color1 = ['red', 'green', 'yellow'];
    var color2 = ['white', 'blue'];
    //添加數組
    var concatColor = color1.concat(color2);
    alert(concatColor);//red,green,yellow,white,blue

    //添加單個值
    var concatSingelColor = color1.concat('orange');
    alert(concatSingelColor);//red,green,yellow,orange

    //不添加值,只是簡單copy

    var concatColor1 = color1.concat();
    alert(concatColor1);//red,green,yellow

2.slice

slice()方法用於從目標數據中截取新數據,不會改變被截取對象的值。

    var color1 = ['red', 'green', 'yellow'];

    //不傳遞參數:表示截取整個數組
    var color2 = color1.slice();
    alert(color2);//red,green,yellow

    //傳遞一個參數:表示從該位置處開始截取數據,直到數組最後一個數
    var color3 = color1.slice(1);
    alert(color3);//green,yellow

    //傳遞2個參數:第一個參數表示從該位置開始截取,第二個參數減1表示所截數據的最後位置
    var color4 = color1.slice(1, color1.length);
    alert(color4);//green,yellow

 四  參考文獻

【01】JavaScript 高級程序設計(第三版)   (美)Nicholas C.Zakas 著       李鬆峯   曹力  譯

【02】JavaScript 權威指南 (第6版)    David  Flanagan 著

相關文章
相關標籤/搜索