js基礎(chǔ)陣營:變量篇之特殊變量-數(shù)組

前面我們以及說過了挡闰,變量的一些基礎(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ù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涡相,一起剝皮案震驚了整個濱河市哲泊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌催蝗,老刑警劉巖切威,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異丙号,居然都是意外死亡先朦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門犬缨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喳魏,“玉大人,你說我怎么就攤上這事怀薛〈滩剩” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵枝恋,是天一觀的道長创倔。 經(jīng)常有香客問我,道長焚碌,這世上最難降的妖魔是什么畦攘? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮十电,結(jié)果婚禮上念搬,老公的妹妹穿的比我還像新娘。我一直安慰自己摆出,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布首妖。 她就那樣靜靜地躺著偎漫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪有缆。 梳的紋絲不亂的頭發(fā)上象踊,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機(jī)與錄音棚壁,去河邊找鬼杯矩。 笑死,一個胖子當(dāng)著我的面吹牛袖外,可吹牛的內(nèi)容都是我干的史隆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼曼验,長吁一口氣:“原來是場噩夢啊……” “哼泌射!你這毒婦竟也來了粘姜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤熔酷,失蹤者是張志新(化名)和其女友劉穎孤紧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拒秘,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡号显,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了躺酒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片押蚤。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖阴颖,靈堂內(nèi)的尸體忽然破棺而出活喊,到底是詐尸還是另有隱情,我是刑警寧澤量愧,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布钾菊,位于F島的核電站,受9級特大地震影響偎肃,放射性物質(zhì)發(fā)生泄漏煞烫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一累颂、第九天 我趴在偏房一處隱蔽的房頂上張望滞详。 院中可真熱鬧,春花似錦紊馏、人聲如沸料饥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岸啡。三九已至,卻和暖如春赫编,著一層夾襖步出監(jiān)牢的瞬間巡蘸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工擂送, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悦荒,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓嘹吨,卻偏偏與公主長得像搬味,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容