第7章 數(shù)組

一碱蒙、數(shù)組的基本概念

1. 定義:

值的有序集合。
值被稱為數(shù)組的元素。元素位置稱為索引(0-2^32-2);數(shù)組是動態(tài)的澎办,會根據(jù)需要增減。稀疏與稠密數(shù)組:length均大于最大的索引號金砍。

2. 創(chuàng)建:

  • 數(shù)組直接量創(chuàng)建
  • 調(diào)用構(gòu)造函數(shù)Array():
    1. 無參數(shù):var a=new Array();創(chuàng)建的是空數(shù)組局蚀,相當于數(shù)組直接兩[];
    2.一個數(shù)值參數(shù):var a=new Array(10);創(chuàng)建的是指定長度的數(shù)組恕稠;
    3.顯示指定兩個或多個參數(shù):var a=new Array(5,4,3,2,1,"testing,testing"),構(gòu)造函數(shù)的參數(shù)成為新數(shù)組的元素琅绅。

3.數(shù)組的讀寫:

使用[]操作符來訪問數(shù)組元素。
注意:屬性名與索引:在0-2^32-2范圍內(nèi)的非負整數(shù)屬性名才是索引鹅巍,數(shù)組會自動維護其length屬性值千扶。

4.稀松數(shù)組:

包含從0開始的不連續(xù)索引的數(shù)組料祠。
創(chuàng)建方法:
* 使用一個數(shù)值參數(shù)的Array構(gòu)造函數(shù)
* 指定數(shù)組的索引值大于當前數(shù)組長度
* delete操作符

5.數(shù)組長度

稠密數(shù)組中l(wèi)ength=數(shù)組中的元素個數(shù);
設(shè)置length屬性小于當前長度的非負整數(shù)值n時澎羞,數(shù)組中≥n的元素會被刪除掉髓绽;

6.數(shù)組元素的添加和刪除:

  1. 添加:為新索引賦值;push()和unshift()方法在末尾或開頭增加數(shù)組元素妆绞。
  2. 刪除:delete操作顺呕,副作用是變?yōu)橄∷蓴?shù)組;pop()和shift()方法在末尾或開頭刪除數(shù)組元素摆碉。

7.數(shù)組遍歷:

for(var i=0,len=keys.length;i<len;i++){/*語句*/}
在對稀松的數(shù)組使用for循環(huán)遍歷時進行檢測塘匣;也可使用for/in循環(huán)進行遍歷。

8.多維數(shù)組:

JavaScript不支持多維數(shù)組巷帝,但可用數(shù)組的數(shù)組近似獲得(即數(shù)組的元素為數(shù)組)忌卤。

二.數(shù)組方法:

(一)ECMAScript3在Array.prototype中定義的一些操作數(shù)組的函數(shù)。

  1. join():將所有元素轉(zhuǎn)化為字符串并連接在一起楞泼,返回最后生成的字符串驰徊;
var a=[1,2,3];
a.join();           //=>"1,2,3"
a.join(" ")         //=>"1 2 3"
a.join("")          //=>"123"
var b=new Array(10);    //長度為10的空數(shù)組;
b.join('-')             //=>'---------':9個連字符組成的字符串
  1. reverse():將數(shù)組中的元素顛倒順序堕阔,返回逆序的數(shù)組棍厂;
var a=[1,2,3];
a.reverse().join();         //=>"3,2,1",并且現(xiàn)在的a是[3, 2, 1]
  1. sort():將數(shù)組的元素排序并返回排序后的數(shù)組。當不帶參數(shù)時調(diào)用按照字母表順序排序(如包含undefined會被排到尾部)超陆;如果按照其他方式牺弹,需要傳遞一個比較函數(shù)。這個函數(shù)決定了它的兩個參數(shù)在排好序的數(shù)組中的先后順序时呀。假設(shè)第一個參數(shù)應該在前张漂,則比較函數(shù)應該返回一個小于0的數(shù)值;反之谨娜,如第一個參數(shù)應該在后航攒,則返回大于0的數(shù)值;并且假設(shè)兩個值相等則返回0趴梢;
var a=[33,4,1111,222];
a.sort()            //=>字母表順序:[1111, 222, 33, 4]
a.sort(function(a,b){
    return a-b;
})                  //=>數(shù)值順序:根據(jù)返回的正負或0來判斷漠畜;[4, 33, 222, 1111]
a.sort(function(a,b){
    return b-a;
})                  //=>數(shù)值相反的順序:[1111, 222, 33, 4]
更復雜的排序:
var a=['ant','Bug','cat','Dog']
a.sort();           //區(qū)分大小寫的排序:["Bug", "Dog", "ant", "cat"]
a.sort(function(s,t){//不區(qū)分大小寫的排序
    var a=s.toLowerCase();
    var b=t.toLowerCase();
    if(a<b) return -1;
    if(a>b) return 1;
    return 0;           
});             //=>["ant", "Bug", "cat", "Dog"]
  1. concat():創(chuàng)建并返回一個數(shù)組。它的元素包括調(diào)用concat()的原始數(shù)組的元素和concat()的每個參數(shù)坞靶。
    注意:如果這些參數(shù)中的任何一個自身是數(shù)組憔狞,則連接的是數(shù)組的元素,而非數(shù)組本身彰阴。但不會遞歸躯喇。
var a=[1,2,3];
a.concat(4,5);      //返回[1,2,3,4,5]
a.concat([4,5]);    //返回[1,2,3,4,5]
a.concat([4,5],[6,7]);//返回[1,2,3,4,5,6,7]
a.concat(4,[5,[6,7]]);//返回[1,2,3,4,5,[6,7]]
  1. slice():返回制定數(shù)組的一個片段或子數(shù)組。它的兩個參數(shù)分別指定了開始和結(jié)束位置。其中負數(shù)表示相對于數(shù)組中最后一個元素的位置廉丽。返回的數(shù)組包含第一個參數(shù)指定位置到不包含第二個參數(shù)之間的所有數(shù)組元素倦微。
    注意:slice()不會修改調(diào)用的數(shù)組
var a=[1,2,3,4,5];
a.slice(0,3)    //返回[1,2,3]
a.slice(3)      //返回[4,5]
a.slice(1,-1)   //返回[2,3,4]
a.slice(-3,-2)  //返回[3]
  1. splice():在數(shù)組中插入或刪除元素的通用方法,會修改調(diào)用的數(shù)組正压。
    splice()的前兩個參數(shù)指定了需要刪除的數(shù)組元素欣福。緊隨其后的任一個數(shù)的參數(shù)指定了需要插入到數(shù)組中的元素,從第一個參數(shù)的位置開始插入焦履。
    splice()返回一個由刪除元素組成的數(shù)組拓劝,或者如果沒有刪除就返回一個空數(shù)組
var a=[1,2,3,4,5,6,7,8];
a.splice(4);        //返回[5,6,7,8],a是[1, 2, 3, 4]
a.splice(1,2);      //返回返回[2,3],a是[1, 4]
a.splice(1,1);      //返回[4],a是[1]

var a=[1,2,3,4,5];
a.splice(2,0,'a','b')   //返回[],a是[1, 2, "a", "b", 3, 4, 5]
a.splice(2,2,[1,2],3)   //返回["a", "b"],a是[1, 2, [1,2], 3, 3, 4, 5]
  1. push()與pop():
    這兩個方法允許將數(shù)組當做棧來使用。
  • push()方法在數(shù)組的尾部添加一個活多個元素嘉裤,并返回數(shù)組的長度郑临。
  • pop()方法則相反,它刪除數(shù)組的最后一個元素屑宠,減小數(shù)組的長度并返回它刪除的值厢洞。
    注意:會修改并替換原始數(shù)組
  1. unshift()與shift():
    這兩個方法行為非常類似于push()與pop();不一樣的是它是在數(shù)組的頭部而不是尾部進行元素的插入和刪除操作。
  2. toString()與toLocalString():
    數(shù)組和其他JavaScript對象一樣擁有toString()方法典奉。針對數(shù)組躺翻,該方法將其每個元素轉(zhuǎn)化為字符串并且用逗號隔開。(和不加任何參數(shù)的join()方法返回的字符串一樣)卫玖。toLocalString是本地化版本公你。
    下列代碼在谷歌瀏覽器打開時,會彈出“Uncaught TypeError: Cannot read property 'toString' of undefined”錯誤假瞬,放到console.log()中不會
[1,2,3].toString()  //'生成1,2,3'
["a","b","c"].toString()//生成'a,b,c'
[1,[2,'c']].toString()//生成'1,2,c'

(二)ECMAScript5定義了9個新的數(shù)組方法來遍歷陕靠、映射、過濾脱茉、檢測剪芥、簡化和搜索數(shù)組。

一般性規(guī)律:大部分ES5的數(shù)組方法第一個參數(shù)都是接收一個函數(shù)并對數(shù)組的每一個元素進行調(diào)用芦劣,大多數(shù)情況下調(diào)用提供的函數(shù)使用三個參數(shù):數(shù)組元素、數(shù)組索引和數(shù)組本身说榆。第二個參數(shù)是可選的虚吟。

  1. forEach():從頭至尾遍歷數(shù)組,為每個元素指定調(diào)用的函數(shù)签财。
            var data=[1,2,3,4,5];
            //計算數(shù)組元素的和值
            var sum=0;
            data.forEach(function(value){
                sum +=value;
            })
            sum                             //=>15
  1. map():將調(diào)用的數(shù)組的每個元素傳遞給指定的函數(shù)串慰,并返回一個數(shù)組,它包含函數(shù)的返回值唱蒸。注意返回的是新數(shù)組邦鲫,不會修改調(diào)用的數(shù)組
            var a=[1,2,3];
            b=a.map(function(x){
                return x*x
            });                             //b是[1,4,9]
  1. filter():返回的數(shù)組元素是調(diào)用的數(shù)組的一個子集。傳遞的函數(shù)事用來做邏輯判定的,該函數(shù)返回true或false庆捺;
            var a=[5,4,3,2,1];
            smallvalues=a.filter(function(x){
                return x<3
            })                              //[2,1]
            everyother=a.filter(function(x,i){
                return i%2==0
            })                              //[5, 3, 1]
  1. every()與some()
  2. reduce()與reduceRight()
  3. indexOf()與lastIndexOf()

三古今、數(shù)組類型

1.定義:

數(shù)組是具有特殊行為的對象。給一個未知的對象滔以,判定它是否為數(shù)組非常有用捉腥。

  1. ECMAScript5中可以用Array.isArray()函數(shù)來做;
Array.isArray([]);      //=>true
Array.isArray({});      //=>false`
  1. 在ES5之前你画,typeof幫不上忙對數(shù)組僅返回“對象”抵碟,instanceof操作符只能用于簡單的情形(web多窗體或窗口存在)。
//ES5之前判斷對象時數(shù)組的方法
var isArray=Function.isArray || function(o){
    return typeof o ==="object" &&
    Object.prototype.toString.call(o)==="[object Array]"
}

2.類數(shù)組對象

  1. 定義:把擁有一個數(shù)值length屬性和對應非負整數(shù)屬性的對象看做一種類型的數(shù)組坏匪。
    Arguments對象就是一個類數(shù)組對象拟逮,DOM方法如document.getElementsByTagName()也返回類數(shù)組對象。
//下面這個函數(shù)用來檢測類數(shù)組對象
//判定o是否為一個類數(shù)組對象
//字符串和函數(shù)有l(wèi)ength屬性适滓,但是它們可以用typeof檢測將其排除敦迄。
//在客戶端JavaScript中,DOM文本節(jié)點也有l(wèi)ength屬性粒竖,需要額外判斷o.nodeType!=3將其排除
function isArrayLike(o){
    if(o &&                         //o非null颅崩、undefined等
        typeof o==="object" &&      //o是對象
        isFinite(o.length) &&       //o.length是有限數(shù)值
        o.length >=0 &&             //o.length為非負值
        o.length===Math.floor(o.length)&&   //o.length是整數(shù)
        o.length<4294967296)        //o.length<2^32
        return true;
    else
        return false;               //否則它不是
}
  1. 類數(shù)組對象沒有繼承自Array.prototype,不能直接在它們上面調(diào)用數(shù)組方法蕊苗,可以間接地使用Function.call方法調(diào)用沿后。
var a={"0":"a","1":"b","2":"c",length:3};           //類數(shù)組對象
Array.prototype.join.call(a,"+")        //=>"a+b+c"
Array.prototype.slice.call(a,0)         //["a", "b", "c"]:真正數(shù)組的副本
Array.prototype.map.call(a,function(x){
    return x.toUpperCase();
})                                      //=>["A", "B", "C"]
//在Firefox 1.5中將這些方法的版本在Array構(gòu)造函數(shù)上直接定義為函數(shù),這樣上述例子可以這樣重寫
var a={"0":"a","1":"b","2":"c",length:3};
Array.join(a,"+")
Array.slice(a,0)
Array.map(a,function(x){return x.toUpperCase();})   
//由于這些不是標準的朽砰,可以增加以下代碼兼容所有瀏覽器:
Array.join=Array.join || function(a,sep){
    return Array.prototype.join.call(a,sep);
}
Array.slice=Array.slice || function(a,from,to){
    return Array.prototype.slice.call(a,from,to);
}
Array.map=Array.map || function(a,f,thisArg){
    return Array.prototype.map.call(a,f,thisArg)
}

3.作為數(shù)組的字符串

除用charAt()方法訪問單個字符以外尖滚,可以用方括號。另可將通用的數(shù)組方法應用到字符串上瞧柔。

var s="JavaScript";
Array.prototype.join.call(s," ")                //=>J a v a S c r i p t
Array.prototype.filter.call(s,function(x){      //過濾字符串的字符
    return x.match(/[^aeiou]/);                 //只匹配非元音字符
}).join("")     

請記灼崤:字符串是不可變值,故把它們看做數(shù)組時造锅,它們也是只讀的撼唾。如push()、sort()哥蔚、reverse()和splice()等數(shù)組方法在字符串上市無效的倒谷,且使用數(shù)組方法修改字符串導致錯誤,出錯的時候是沒有提示的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末糙箍,一起剝皮案震驚了整個濱河市渤愁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌深夯,老刑警劉巖抖格,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡雹拄,警方通過查閱死者的電腦和手機收奔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來办桨,“玉大人筹淫,你說我怎么就攤上這事∧刈玻” “怎么了损姜?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長殊霞。 經(jīng)常有香客問我摧阅,道長,這世上最難降的妖魔是什么绷蹲? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任棒卷,我火速辦了婚禮,結(jié)果婚禮上祝钢,老公的妹妹穿的比我還像新娘比规。我一直安慰自己,他們只是感情好拦英,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布蜒什。 她就那樣靜靜地躺著,像睡著了一般疤估。 火紅的嫁衣襯著肌膚如雪灾常。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天铃拇,我揣著相機與錄音钞瀑,去河邊找鬼。 笑死慷荔,一個胖子當著我的面吹牛雕什,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播显晶,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼贷岸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吧碾?” 一聲冷哼從身側(cè)響起凰盔,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤墓卦,失蹤者是張志新(化名)和其女友劉穎倦春,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡睁本,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年尿庐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吹埠,靈堂內(nèi)的尸體忽然破棺而出寂曹,到底是詐尸還是另有隱情,我是刑警寧澤怔接,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響惹资,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜航闺,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一褪测、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧潦刃,春花似錦侮措、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至滑黔,卻和暖如春笆包,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背略荡。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工庵佣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人汛兜。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓巴粪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親粥谬。 傳聞我的和親對象是個殘疾皇子肛根,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,219評論 0 4
  • PHP常用函數(shù)大全 usleep() 函數(shù)延遲代碼執(zhí)行若干微秒。 unpack() 函數(shù)從二進制字符串對數(shù)據(jù)進行解...
    上街買菜丶迷倒老太閱讀 1,360評論 0 20
  • php usleep() 函數(shù)延遲代碼執(zhí)行若干微秒漏策。 unpack() 函數(shù)從二進制字符串對數(shù)據(jù)進行解包派哲。 uni...
    思夢PHP閱讀 1,984評論 1 24
  • 人山人海啊 一個浪 接著一個浪 希望很快就會到家 月兒戀戀山崗 海潮依依口岸 夜色舞動喧騰時 最容易心靈沉寂 落葉...
    樹梢的雪閱讀 195評論 0 1
  • 該不該投訴外賣小哥這件事? 在別人做得好的時候掺喻,要不吝嗇自己的贊美 芭届,在別人做的不好的 地方要站出來指證储矩,毋以善小...
    真真卒跡閱讀 441評論 0 0