天天看點

JavaScript進階程式設計閱讀筆記—引用類型(Array)

    Array類型也是我們在開發中最常用的類型之一。當然ECMAScript中的數組與其他許多語言有一個極大的差別就是ECMAScript數組中的每一項值能夠儲存任意類型的資料,也就是說數組中的第一項可以儲存字元串,第二項可以儲存數值,第三項可以儲存對象以此類推。而且ECMAScript中的數組大小是可以動态調整的,即可以随着資料的添加而自動增長。

    建立數組的方式有兩種:

    第一種是通過Array構造函數建立。

var ages = new Array();
var names = new Array(20);
var colors = new Array("red", "blue", "green")
           

   如果你确定數組的長度時,則可以構造函數傳入你想建立長度的數組,當然你也可以通過構造函數傳入數組中應該包含的項。另外在使用Array構造函數時也可以省略new操作符。

var colors = Array(3);
var names = Array("jiaojiao");
           

    建立數組的第二種基本方法是使用數組的字面量表示法。

var colors = ["red", "blue", "green"];
var names = [];
var values = [1, 2,]; // 最好不要這麼做,這樣會導緻建立2或3項的數組
           

    在讀取和設定數組的值時,要使用方括号并提供相應值的基于0的索引值。當索引值小于數組的長度時,則會傳回對應項的值,如果設定數組的值也使用同樣的文法則會替換指定位置的值。如果設定某個值但索引值超過數組的長度時,那麼數組就會自動增加該值到數組中,數組長度加1。

var colors = ["red", "blue", "green"]; // 定義一個字元串數組
alert(colors[0]); // 顯示第一項
colors[2] = "black"; // 修改第三項
colors[3] = "brown"; // 新增第四項
           

    數組的項數儲存在length中,這個屬性始終傳回0或者更大項,但這個屬性并不是隻讀的。我們可以通過設定這個屬性添加或删除數組末尾項。

var colors = ["red", "blue", "green"]; //建立一個包含3項的數組
colors.length = 2;
alert(colors[2]); // undefined
           
var colors = ["red", "blue", "green"];
colors.length = 4;
alert(colors[3]); // undefined
           

    這裡我們設定了一個3項的數組,但是我們将length屬性設定成了4,這個數組不存在位置3,是以我們通路它時就得到了特殊值undefined。

檢測數組

    通常我們檢測數組都是通過instanceof操作符來檢測結果。但是這是在對于一個網頁或者一個全局作用域中才有用,如果這個網頁包含多個架構,那實際上就存在兩個以上不同全局執行環境,是以會存在兩個以上不同版本的Array構造函數。

    是以在ECMAScript5中新增了Array.isArray()方法。

轉換方法

    所有對象都具有toString()、toLocaleString()和valueOf()方法。

    toString()和toLocaleString()這兩個方法沒有很大的差別都是擷取值的字元串格式。

    valueOf()是擷取對象的值。

    join():使用join()方法,可以使用不同的分隔符來建構這個字元串。join()方法隻接收一個參數,即用作分隔符的字元串,然後傳回包含所有數組的字元串。如果不給join()方法傳入任何值,或者給他傳入undefined,則使用都好作為分隔符。

棧方法

棧:棧是一種LIFO(Last-In-First-Out,後進先出)的資料結構,也就是最新添加項最早被移除。

push():該方法可以接收任意數量的參數,把他們逐個添加到數組末尾,并傳回修改後數組的長度。

pop():該方法則是從數組末尾移除最後一項,減少數組的length值,然後傳回移除的項。

隊列方法

隊列:隊列資料結構的通路規則是FIFO(First-In-Fist-Out,先進先出)。隊列在清單的末尾添加項,從清單的前端移除項。

shift():它能夠移除數組中的第一項并傳回該項,同時将數組長度減1。結合使用shift()和push()方法。可以像使用隊列一樣使用數組。

unshift():它能在數組前端添加任意個項并傳回新數組的長度。可以同時使用unshift()和pop()方法,可以從相反方向來模拟隊列。

重排序方法

reverse():反轉數組的順序。

sort():在預設情況下,sort()方法按升序排列數組項——即最小的值位于最前面,最大的值排在最後面。為了實作排序,sort()方法會調用每個數組項的toString()轉型方法,然後比較得到的字元串,以确定如何排序。即使數組中的每一項都是數值,sort()方法比較的也是字元串。是以sort()方法可以接收一個比較函數作為參數,以便我們指定哪個值位于哪個值的前面。

var values = [0, 1, 5, 10, 15];
values.sort();
alert(values); // 0, 1, 10, 15, 5
           
function compare(value1, value2) {
    if(value1 < value2) {
        return -1;
    } else if (value1 > value2) {
        return 1;
    } else {
        return 0;
    }
}

var values = [0, 1, 5, 10, 15];
values.sort(compare);
alert(values); // 0, 1, 5, 10, 15
           

    reverse()和sort()方法的傳回值是經過排序之後的數組。

操作方法

    concat():基于目前數組中的所有項建立一個新數組。

var colors = ["red", "blue", "green"];
var colors2 = colors.concat("yellow", ["black", "brown"]);
alert(colors2); // red, blue, green, yellow, black, brown
           

    slice():它能夠基于目前數組中的一或多項建立一個新數組。該方法可以接收一或者兩個參數,即要傳回項的起始和結束位置。如果有兩個參數,該方法傳回起始和結束位置之間的項——但不包括結束位置的項。并且slice()方法不會影響原始數組。

splice():主要用途是向數組中部插入項。

             删除:可以删除任意數量的項,隻需指定2個參數:要删除的第一項的位置和要删除的項數。

             插入:可以向指定位置插入任意數量的項,隻需要提供3個參數:起始位置、0(要删除的項數)和要插入的項(可以插入多個項)。

             替換:可以向指定位置插入任意數量的項,且同時删除任意數量的項,隻需指定3個參數:起始位置、要删除的項數和要插入的任意數量的項。

    splice()方法始終都會傳回一個數組,該數組中包含從原始數組中删除的項,如果沒有删除任何項,則傳回一個空數組。

var colors = ["red", "blue", "green"]
var remove = colors.splice(0, 1);
alert(remove); // red
           

位置方法

    indexOf():從前往後查詢需要查詢的項的索引。

    lastIndexOf():從後往前查詢需要查詢的項的索引。

    這兩個方法都接收兩個參數:要查找的項和(可選的)表示查找起點位置的索引。

疊代方法

    every():對數組中的每一項運作給定函數,如果該函數對每一項都傳回true,則傳回true。

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

    filter():對數組中的每一項運作給定函數,傳回該函數會傳回true的項組成的數組。

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

    forEach():對數組中的每一項運作給定函數,這個方法沒有傳回值。

var numbers = [1, 2, 3, 4, 5];
numbers.forEach(function(item, index, array){
    // 執行邏輯操作
});
           

    map():對數組中的每一項運作給定函數,傳回每次函數調用的結果組成的數組。

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

    some():對數組中的每一項運作給定函數,如果該函數對任一項傳回true,則傳回true。

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

歸并方法

    reduce():從數組的第一項開始,逐個周遊到最後。

    reduceRight():從數組的最後一項開始,向前周遊到第一項。

    這兩個方法都接收兩個參數:一個在每一項上調用的函數和(可選)作為歸并基礎的初始值。傳給reduce()和reduceRight()的函數接收4個參數:前一個值、目前值、項的索引和數組對象。這個函數傳回的任何值都會作為第一個參數自動傳給下一項。

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

繼續閱讀