淺析JavaScript之數組


 一  概述

     JavaScript數組同后端語言一樣,具有它自己的數據結構,歸根結底,這種數據結構,本質就是一種集合。

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

不屬於整型

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

   然而,在JavaScript中,數組的定義卻是非常寬松的,這也決定了其能存儲一切數據的特點。JavaScript數組具有如下特點

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

   特點2:存儲不同基本數據類型的數據;

   特點3:存儲對象

   這三個特點,我們可歸結為一句話:JavaScript存儲一切對象,而不像后端語言那樣,只能存儲相同數據類型。除此之外,JavaScript數組還提供了很多豐富的操作方法。如下為常用的操作方法。

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

二  對數組的基本操作

(一)創建數組

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

   //第一種創建數組的方式:構造函數方式
    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 著


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM