數組
1.數組的概述
js中的數組是可以存放任意資料類型值的集合,數組的元素可以是任意資料類型,數組的長度可以動态調整。
2.數組的建立
-
字面量方式
由一對中括号“[ ]”包裹數組的元素,元素之間用逗号 “,” 隔開。
//元素可以是任意的資料類型
var arr = [123,"hello",function(){},null];
-
構造函數方式
通過Array() 構造函數來建立數組
/*如果傳入的參數是一個number類型的整數,則代表建立的數組長度,如果是小數則會報錯,
如果是其他類型的則會當成元素存進去。*/
var arr = new Array();
//建立一個長度為6的數組
var arr = new Array(6)
/*建立一個包含三個元素,長度為3的數組[ 3, 5, 'hello' ]。
(注:如果是字元串的參數,記得加引号)*/
var arr = new Array(3,4,'hello')
3.數組的通路
-
通路數組元素
數組變量名[索引],索引值從0開始,到數組長度length-1.
//如果索引值大于數組長度或者為負數,傳回undefined。
var arr = [123,'hello'];
arr[0]; //通路數組的第一個元素,傳回值為123
arr[3]; //undefined
//可以通過索引改變數組元素
arr[0] = 456; //把數組第一個元素123改成456
//如果索引大于數組長度,則會在指定的位置增加新的元素,并且數組長度變成索引值+1
arr[4] = 'world'; //[ 456, 'hello', <2 empty items>, 'world' ],數組長度變成5
4.數組API
4.1數組序列化
toString() 以字元串形式傳回數組元素,并用逗号分隔
join() 以字元串形式傳回數組元素,并用括号裡指定的字元串分隔(括号裡的分隔字元串要加引号)
4.2構造函數的方法
-
Array.isArray()
判斷某個變量是否是一個數組對象
-
Array.from()
從類數組對象或者可疊代對象中建立一個新的數組執行個體。即把傳進括号裡的對象分解成單獨的字元串,然後形成一個新的數組。
//[ '1', '2', '3', '4', '5', '6' ]
var Arr = Array.from("123456");
- Array.of()
根據一組參數來建立新的數組執行個體,支援任意的參數數量和類型。
Array.of(7); // [7]
Array.of(1, 2, 3); // [1, 2, 3]
這個方法的主要目的,是彌補數組構造函數Array()的不足。因為參數個數的不同,會導緻Array()的行為有差異。 Array.of()方法基本上可以用來替代Array()或new Array().
4.3棧與隊列方法
-
Array.prototype.push()
向數組的末尾添加一個或多個元素,傳回值是數組的新長度。
-
Array.prototype.pop()
删除數組的最後一個元素,傳回值是被删除的元素。
-
Array.prototype.shift()
删除數組的第一個元素,傳回值是第一個元素的值。
-
Array.prototype.unshift()
向數組的開頭添加一個或多個元素,傳回值是數組的新長度。
注:以上四種方法都會改變原數組的長度。
排序方法
-
Array.prototype.reverse()
用于颠倒數組中元素的順序,傳回值是颠倒後的數組。
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.reverse();//[ 'Mango', 'Apple', 'Orange', 'Banana' ]
-
Array.prototype.sort()
用于對數組元素進行排序,預設按字母升序(Ascall編碼)。如果是數字,則預設隻比較第一個數字的大小進行升序。
如果想要進行真正的數字排序,則需要自己定義一個函數作為參數進行調用。
數字升序:
var arr = [5,80,60,9,10];
arr.sort(function(a,b){
return a-b;
})
//[ 5, 9, 10, 60, 80 ]
降序的話則把函數傳回值改成 b-a就可以了。
因為無論是a>b還是b>a,return a-b 總能得到升序的結果,而 return b-a 總能得到降序的結果。
注:以上兩種排序方式都會改變原數組,而不會建立新的數組副本。
4.5 操作方法
-
Array.prototype.concat()
用于連接配接兩個或者多個數組。
說白了,concat()方法就是在原數組的後面拼接上傳入的參數。
參數是必需的,可以是數組對象,也可以是具體的值。傳回值是一個新的數組。
-
Array.prototype.slice()
用于從數組中傳回標明的元素:[start,end)。
start:可選。開始選取的位置的索引值,如果為負數,則表示原數組的倒數第幾個元素開始。
end:可選。結束選取的位置的索引值。如果沒有該參數,則表示截取從start到數組結束的所有元素。如果為負數,則表示原數組的倒數第幾個元素結束。
傳回值:一個新的數組。包含從 start 到 end (不包括該元素)的 arrayObject 中的元素。
-
Array.prototype.splice()
splice() 方法用于添加或删除數組中的元素。
注意: 這種方法會改變原始數組。
index:必需。在某個位置進行 添加/删除 的索引值,必須是數字。
howmany:可選。删除元素的個數,必須是數字。如果為0,則表示不删除元素;如果未規定,則表示删除從index開始到原數組末尾的所有元素。
item1, …, itemX:可選。要添加到數組的新元素。
傳回值:傳回由被删除的元素組成的新數組。如果沒有被删除的元素,則傳回一個空數組。
添加新的元素:
var Naruto = ['鳴人','佐助','卡卡西','鼬','柱間']
//從數組索引位置 2 開始,不删除元素,添加兩個新的元素'帶土','琳'
Naruto.splice(2,0,'帶土','琳')
console.log(Naruto);//[ '鳴人', '佐助', '帶土', '琳', '卡卡西', '鼬', '柱間' ]
移除數組的第三個元素,并在數組第三個位置添加新元素:
var Naruto = ['鳴人','佐助','卡卡西','鼬','柱間']
//在數組的第三個位置删除一個元素,并添加兩個新的元素
Naruto.splice(2,1,'帶土','琳')
console.log(Naruto);//[ '鳴人', '佐助', '帶土', '琳', '鼬', '柱間' ]
從第三個位置開始删除數組後的兩個元素:
var Naruto = ['鳴人','佐助','卡卡西','鼬','柱間']
Naruto.splice(2,2)
console.log(Naruto);[ '鳴人', '佐助', '柱間' ]
4.6 位置方法
-
Array.prototype.indexOf()
從start處開始檢索目标元素item的位置,沒有指定start參數時則從頭開始檢索。
傳回值:目标元素在數組中的位置,沒有檢索到則傳回-1
-
Array.prototype.lastIndexOf()
此方法用于傳回目标元素在數組中最後出現的位置。
如果有參數start,則從start處,向着數組開頭檢索;如果沒有,則從尾到頭開始檢索。
傳回值:數組中該元素最後一次出現的索引,如未找到傳回-1。
4.7 疊代方法
-
Array.prototype.every()
every()方法通過指定的函數檢測數組中的所有元素,隻有所有元素都符合條件才會傳回true,否則傳回false。
注:此方法不會改變原始數組,不會對空數組進行檢測。
array.every(function(currentValue,index,arr){
//函數代碼塊
}, thisValue)
function(currentValue,index,arr):必需。自己定義的函數。
thisValue:可選。對象作為該執行回調時使用,傳遞給函數,用作 “this” 的值。 如果省略了 thisValue ,“this” 的值為 “undefined”。
currentValue:必需。目前數組元素的值。
index:可選。目前元素的索引值。
arr:可選。目前元素屬于的數組對象。
-
Array.prototype.some()
some()方法用于檢測數組中是否存在滿足指定條件的元素。
此方法會依次檢測每個數組,但隻要有一個元素滿足條件,則傳回true,并停止檢測,否則傳回false。
注:不會對空數組檢測,不改變原數組。
-
Array.prototype.filter()
filter()方法用于把符合條件的元素組成一個新的數組。
注:不檢測空數組,不改變原數組。
傳回值:符合條件的元素組成的數組。如果沒有符合條件的元素則傳回空數組。
-
Array.prototype.map()
map()方法,把元素經過函數處理過後的值(eg:函數把元素開平方,求和),組成新的數組。
注:不檢測空數組,不改變原數組。
傳回值:一個新的數組。
-
Array.prototype.forEach()
forEach()方法可以周遊數組的每一個元素,然後把元素傳遞給回調函數。
注:forEach() 對于空數組是不會執行回調函數的。
傳回值:undefined
forEach()與map()差不多,但是前者是沒有傳回值的
- 不改變原數組的方法
join()—把數組的所有元素放入一個字元串。
toString()—把數組轉換為字元串,并傳回結果。
concat()—連接配接兩個或更多的數組,并傳回結果。
every()—檢測數組元素的每個元素是否都符合條件。
some()—檢測數組元素中是否有元素符合指定條件。
filter()—檢測數組元素,并傳回符合條件所有元素的數組。
indexOf()—搜尋數組中的元素,并傳回它所在的位置。
lastIndexOf()—傳回一個指定的字元串值最後出現的位置,在一個字元串中的指定位置從後向前搜尋。
map()—通過指定函數處理數組的每個元素,并傳回處理後的數組。
slice()—選取數組的的一部分,并傳回一個新數組。
valueOf()—傳回數組對象的原始值。
- 改變原數組的方法
pop()—删除數組的最後一個元素并傳回删除的元素。
push()—向數組的末尾添加一個或更多元素,并傳回新的長度。
shift()—删除并傳回數組的第一個元素。
unshift()—向數組的開頭添加一個或更多元素,并傳回新的長度。
reverse()—反轉數組的元素順序。
sort()—對數組的元素進行排序。
splice()—用于插入、删除或替換數組的元素。