前面我們以及說過了挡闰,變量的一些基礎(chǔ)知識头岔,這章我們將來看看特殊一個變量數(shù)組。在其他語言中我們可以知道劲赠,數(shù)組一般存儲的是相同類型的數(shù)據(jù)且是固定數(shù)量的涛目,不允許不同也不允許隨意改變長度,但是由于js的天然弱語言類型凛澎,所以我們的數(shù)組中可以存儲不同類型的數(shù)據(jù)霹肝。同時可以動態(tài)調(diào)整數(shù)組的長度。下面我們來進(jìn)入數(shù)組的世界
一:數(shù)組的創(chuàng)建
在js中我們有兩種方法塑煎,
1.1 Array構(gòu)造函數(shù)
第一種采用Array構(gòu)造函數(shù)沫换,其構(gòu)造函數(shù)接受兩種數(shù)據(jù)格式,如果參數(shù)為數(shù)字且只有一個參數(shù)最铁,則創(chuàng)建傳入?yún)?shù)大小的數(shù)字苗沧,如果是非數(shù)字,則根據(jù)arguments來創(chuàng)建數(shù)組炭晒。我們來看以下代碼
var a = new Array(12); // [empty*12]
var b = new Array('1','2','3') // [1,2,3];
1.2 數(shù)組字面量
數(shù)組字面量方法是通過[],每一項(xiàng)通過逗號分隔
var a = [1,2];
var b = [];
二:數(shù)組的檢查以及轉(zhuǎn)換
2.1 數(shù)組的檢查
我們在前面已經(jīng)說過可以通過typeof 方法來檢查數(shù)據(jù)的類型,那么我們看下下面的代碼
typeof [1,2];//object
我們在前面說到過甥角,通過typeof方法只能返回6大數(shù)據(jù)類型(參看數(shù)據(jù)類型篇)所以我們在這里需要通過另一個方法來判斷网严,那就是通過instanceof Array方法來判斷
[1,2] instanceof Array;// true
所以如果我們需要判斷一個數(shù)據(jù)是否是數(shù)組,我們可以通過以下方法來判斷
function isArray(data){
return typeof data === 'object' && data instanceof Array;
}
當(dāng)然我們還有更簡單的檢查方法嗤无,那就是通過Array.isArray來判斷
Array.isArray([1,2,3]) // true
2.2 數(shù)據(jù)轉(zhuǎn)換
在上一章數(shù)據(jù)類型轉(zhuǎn)換中我們提到了對象的數(shù)據(jù)轉(zhuǎn)換震束。我們在這章中詳細(xì)看下一個數(shù)組轉(zhuǎn)換成字符串的過程。例如我們現(xiàn)在需要將一個數(shù)組[1,2]轉(zhuǎn)換成字符串
var a= [1,2];
//1:首先執(zhí)行數(shù)組的valueOf 方法
console.log(a.valueOf())//返回[1,2]
// 2:有valueOf方法当犯,返回值不是基本數(shù)據(jù)類型垢村。調(diào)用toString方法
console.log(a.toString())//'1,2'
根據(jù)上面的步驟我們可以實(shí)現(xiàn)我們的底層實(shí)現(xiàn)方法
function obj2str(data){
if(Object.hasOwnProperty.call(data,'valueOf') && ['number','string','number'].includes(data.valueOf())) {
return data.valueOf();
} else {
return data.toString();
}
3:常見方法
push(元素):從數(shù)組的尾部添加元素
unshift(元素):從數(shù)組的頭部添加元素
pop():從數(shù)組的頭部移除元素
shift():從數(shù)組的尾部移除元素
sort(function?)數(shù)組的升序,具體的規(guī)則根據(jù)所傳入的方法來定嚎卫,如果沒有傳入方法則采用默認(rèn)規(guī)則通過冒泡排序[算法排序篇](后面補(bǔ)充后添加)進(jìn)行升序嘉栓,默認(rèn)規(guī)則如下:
1:將前項(xiàng)與后項(xiàng)轉(zhuǎn)換成字符串
2:如果前項(xiàng)在后項(xiàng)前面,則返回false,不升序拓诸,相同不變侵佃,否則,返回ture,升序
因此我們可以來實(shí)現(xiàn)底層的sort基本升序規(guī)則方法
var a = [1,3,2,4];
a.sort((a,b)=> a-b;)
reverse(function?)數(shù)組的降序奠支,規(guī)則同sort
concat(a,b....)創(chuàng)建一個新數(shù)組馋辈,將數(shù)組進(jìn)行合并,不會改變原有的數(shù)組
slice(number1,number2?)創(chuàng)建一個新數(shù)組倍谜,從原有數(shù)組的number1位置迈螟,直到number2索引位置數(shù)據(jù)叉抡,如果number2不存在,則到最后,如果number存在答毫,且是正整數(shù)褥民,則直接到number2所在所在索引,如果是負(fù)數(shù)烙常,則到數(shù)組長度+number2轴捎。如果相加后以及原本起始位置,小于結(jié)束位置蚕脏,則返回空數(shù)組侦副。所以我們可以實(shí)現(xiàn)下底層代碼邏輯
Array.property.slice = function(){
var stat = arguments[0];
let num2 = arguments[1];
var end = this.length;
if(num2) {
if(num2 < 0) {
end = this.length + num2;
}
if(start >= end) {
//返回空數(shù)組
} else {
//取stat-數(shù)組末尾間的數(shù)據(jù)返回
}
} else {
//取stat-數(shù)組末尾間的數(shù)據(jù)返回
}
}
splice(index,number?,元素?):從原有數(shù)組中移除或者添加或者替換元素,如果number存在驼鞭,且大于0秦驯,則將原有數(shù)組index位置處的數(shù)據(jù)移除,且返回挣棕。如果需要添加的元素(可以是多個)存在译隘,則將需要添加的元素插入到index位置處
indexOf(需要查找的元素|function):如果傳入的是元素,則從數(shù)組中找到此元素的位置洛心,不在數(shù)組中返回-1.如果傳入的是函數(shù)固耘,則會按照函數(shù)的規(guī)則進(jìn)行查找。
lastIndexOf(需要查找的元素|function)查找最后的一個匹配的词身,規(guī)則同inexOf
every(function)根據(jù)傳入的函數(shù)厅目,來判斷數(shù)組中的每一項(xiàng)是否都滿足,如果都滿足法严,返回true,否則返回false
some(function)根據(jù)傳入的函數(shù)损敷,來判斷數(shù)組中的是否有一項(xiàng)滿足,如果有一項(xiàng)滿足深啤,返回true,否則返回false
filter(function)根據(jù)傳入的函數(shù)拗馒,來過濾數(shù)組中的每一項(xiàng),返回滿足調(diào)條件的元素的數(shù)組
forEach(function)根據(jù)傳入的函數(shù)溯街,來對數(shù)組的每一項(xiàng)進(jìn)行處理诱桂,不返回任何信息
map(function)根據(jù)傳入的函數(shù),返回每一項(xiàng)執(zhí)行后的結(jié)果數(shù)組
reduce(function(pre,current,index,array))根據(jù)傳入的函數(shù)呈昔,來對前一項(xiàng)和當(dāng)前項(xiàng)進(jìn)行歸并處理访诱,返回最終值
reduceRight(function(pre,current,index,array))根據(jù)傳入的函數(shù),來對前一項(xiàng)和當(dāng)前項(xiàng)進(jìn)行歸并處理韩肝,返回最終值,但是其方法是從數(shù)組的最后一項(xiàng)開始
至此關(guān)于數(shù)組以及常見方法触菜,我們就說到這了,下一章我們將來看看另一個特殊的變量哀峻,函數(shù)