一 概述 JavaScript數組同後端語言一樣,具有它自己的數據結構,歸根結底,這種數據結構,本質就是一種集合。 在後端語言中(如java,.net等),數組是這樣定義的:數組是用來存儲相同數據類型的集合。這個定義,“相同數據類型”6個字限制了數據只能存儲相同的數據類型,如int[]數組只能存儲數 ...
一 概述
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 著