Javascript數(shù)組詳解

數(shù)組的定義

數(shù)組是按序號排列的一組值酌畜,每個值的位置都有編號(從0開始)。數(shù)組本質(zhì)上是一種特殊的對象穆律。它的鍵名是按(0,1导俘,2...)排列的一組數(shù)字峦耘。

  1. 創(chuàng)建數(shù)組:

    var arr = new Array(values);
    var arr = [vaules];
    
  2. 判斷比是否是個數(shù)組

    • Array.isArray(arr)
    • arr instanceof Array
  3. 取數(shù)組元素
    arr[index]

  4. length 屬性
    返回數(shù)組的成員數(shù)量。
    Javascript使用一個32位整數(shù)旅薄,保存數(shù)組的元素個數(shù)辅髓。這意味著數(shù)組的成員最多只有4294967295個(232-1)。

    var arr = ['a','b'];
    arr.length  // 2
    arr.[10] = 'c'
    arr.length //11
    

    從上面的輸出結(jié)果可以看出少梁,length屬性可以動態(tài)變化洛口,如果將length屬性設(shè)為 0 ,就會將數(shù)組清空凯沪。如果設(shè)置的數(shù)小于原有的個數(shù)第焰,那么在這個數(shù)后面的數(shù)值就自動刪除了。反過來妨马,如果設(shè)置的數(shù)大于原有的個數(shù)挺举,數(shù)組的成員將增大,都為 undefined烘跺。

    var a = [1,2];
    a.length = 5;
    a[4] // undefined
    a.length = 1;
    a.[1] // undefined
    a.length = 0;
    a  //[]
    
  5. 增加數(shù)組元素

    • push()方法 在數(shù)組的末尾增加一個或多個元素湘纵,并返回數(shù)組的新長度。
    • unshift()方法 在數(shù)組的開頭增加一個或多個元素滤淳,并返回數(shù)組的新長度梧喷。
    • length 屬性
    var arr = [1, 2, 3]
    arr.push(4)
    arr  // 1, 2, 3, 4
    arr.unshift(6)
    arr  // 6, 1, 2, 3, 4
    arr[arr.length] = 7  // 與push()方法類似
    arr  // 6, 1, 2, 3, 4, 7
    
    
  6. 刪除數(shù)組中的元素

    • delete 運(yùn)算符,可以刪除數(shù)組中的某個元素,但這不會改變length屬性的值.
    • pop() 方法 刪除數(shù)組的最后一個元素铺敌,并返回這個元素绊困。
    • shift() 方法 刪除數(shù)組的第一個元素,并返回這個元素适刀。
    var arr = [1,2,3];
    delete arr[0];
    arr   // [undefined,2,3]
    arr.length  // 3
    var last = arr.pop()
    var first = arr.shift()
    last // 3
    first // undefined
    arr //2
    

類數(shù)組對象

在js中,有些對象被叫做“類數(shù)組對象”(array-like object)煤蹭,因?yàn)檫@些對象看起來很像數(shù)組笔喉,可以使用length屬性,但是無法使用數(shù)組的方法硝皂。
典型的類數(shù)組對象是函數(shù)的arguments對象常挚,以及大多數(shù)DOM元素集,還有字符串稽物。

// arguments對象
function args() {return arguments; }
var arraylike = args('a','b')
arrayLike[0]  // 'a'
arrayLike.length // 2
arrayLike instanceof Array // false
Array.isArray(arrayLike)  // false

// DOM元素集
var elts = document.getElementsByTagName('p');
elts.length  // 3
eles instanceof Array  // false

//字符串
'abc'[1]  // 'b'
'abc'.length  // 3
'abc' instanceof Array  // false

數(shù)組的slice方法能將類數(shù)組對象奄毡,變成真正的數(shù)組。slice方法后面會結(jié)介紹贝或。

var arr = Array.prototype.slice.call(arrayLike);

數(shù)組的遍歷

  1. for...in 循環(huán)

    var a =[1, 2, 3];
    a.other = 'other';
    for (var i in arr){
        console.log( arr[i]);
    }
    // 1, 2, 3, other
    

    從上面的輸出結(jié)果可以看出吼过,利用for..in循環(huán)會將動態(tài)添加的非數(shù)字鍵的值遍歷出來,因此需要使用的時候需要注意咪奖。

  2. for 循環(huán)和 while 循環(huán)

    var a = [1, 2, 3];
    
    // for循環(huán)
    for(var i = 0; i < a.length; i++) {
      console.log(a[i]);
    }
    
    // while循環(huán)
    var i = 0;
    while (i < a.length) {
      console.log(a[i]);
      i++;
    }
    
    var l = a.length;
    while (l--) {
      console.log(a[l]);
    }
    
  3. forEach()方法

    //array.forEach(callback[, thisArg])
    //callback 在數(shù)組的每一項(xiàng)上執(zhí)行的函數(shù)盗忱,接受三個參數(shù):item: 數(shù)組當(dāng)前項(xiàng)的值,index: 當(dāng)前項(xiàng)的索引羊赵,arr:數(shù)組本身趟佃。
    var arr = [1, 2, 3]
    arr.forEach(function(item, index, arr){
        console.log(item, index);
    });
    //1 0
    //2 1
    //3 2
    

數(shù)組常用的方法

數(shù)組常用的方法
  1. join() 將數(shù)值轉(zhuǎn)換為字符串

    var arr = [1, 2, 3];
    arr.join(); // "1,2,3"
    arr.join("_"); // "1_2_3"
    
  2. reverse() 將數(shù)組逆序

    // 原數(shù)組會被修改
    var arr = [1, 2, 3];
    arr.reverse(); // [3, 2, 1]
    arr; // [3, 2, 1]
    
  3. sort() 數(shù)組排序
    默認(rèn)情況下是升序排列的,底層是調(diào)用了每個數(shù)組項(xiàng)的 toString() 方法昧捷,然后比較得到字符串闲昭,即使每個數(shù)組項(xiàng)的數(shù)值是數(shù)字,比較的也是字符串靡挥。

    // 原數(shù)組會被修改
    var arr = [1, 12, 213, 1432, 'a'];
    arr.sort(); // [1, 12, 1432, 213, "a"]
    arr.sort(function(a, b){
        return b-a; //按倒序排列數(shù)組
    });
    
    
  4. concat() 數(shù)組合并
    用法:array.concat(value1, value2, ..., valueN)

    // 原數(shù)組不會被修改
    var arr =[1, 2, 3]
    arr.concat(4, 5);
    arr; //[1, 2, 3]
    arr.concat([11,2],3); // [1, 2, 3, 11, 2, 3]
    
  5. slice() 返回部分?jǐn)?shù)組
    用法:array.slice(begin[,end])

    slice用于復(fù)制數(shù)組序矩,復(fù)制完后舊數(shù)組不變,返回得到的新數(shù)組是舊數(shù)組的子集芹血。

    第一個參數(shù)begin是開始復(fù)制的位置贮泞,需要注意的是,可以設(shè)負(fù)數(shù)幔烛。設(shè)負(fù)數(shù)表示從尾往前數(shù)幾個位置開始復(fù)制啃擦。例如slice(-2)將從倒數(shù)第2個元素開始復(fù)制。另外需要注意的是饿悬,該參數(shù)雖未標(biāo)注為可選令蛉,但實(shí)際上是可以省略的,省略的話默認(rèn)為0。

    第二個參數(shù)end可選珠叔,表示復(fù)制到該位置的前一個元素蝎宇。例如slice(0,3)將得到前3個元素,但不包含第4個元素祷安。不設(shè)的話默認(rèn)復(fù)制到數(shù)組尾姥芥,即等于array.length。

    //原數(shù)組不會被修改
    var arr = [1, 2, 3, 4, 5];
    arr.slice(); //[1, 2, 3, 4, 5]
    arr.slice(1,3); // [2, 3]
    arr.slice(1, -1); // [2, 3, 4]
    arr; // [1, 2, 3, 4, 5]
    
  6. splice() 數(shù)組拼接
    用法:array.splice(start, deleteCount[, item1[, item2[, ...]]])

    • start 指要從哪一位開始修改內(nèi)容汇鞭,如果超出了數(shù)組的長度凉唐,則從數(shù)組末尾開始添加內(nèi)容;如果是負(fù)值霍骄,則表示從數(shù)組末位開始的第幾位台囱。
    • deleteCount 表示要移除的數(shù)組元素的個數(shù)
    • item 要添加進(jìn)數(shù)組的元素

    最主要的的用途是向數(shù)組的中部插入元素。

    //原數(shù)組會被修改
    var arr = [1, 2, 3, 4, 5];
    //從第三個數(shù)組元素刪除
    arr.splice(2); // returns [3, 4, 5] 
    arr; // [1, 2]
    //從第三個數(shù)組元素刪除读整,刪除兩個元素
    arr.splice(2, 2) // returns [3, 4]
    arr; // [1, 2, 5]
    //將'a','b'替換到數(shù)組的第二個元素
    arr.splice(1, 1, 'a', 'b')
    
    
  7. forEach() 數(shù)組遍歷
    用法:array.forEach(callback[, thisArg])
    callback 在數(shù)組的每一項(xiàng)上執(zhí)行的函數(shù)簿训,接受三個參數(shù):item:數(shù)組當(dāng)前項(xiàng)的值,index: 當(dāng)前項(xiàng)的索引米间,arr:數(shù)組本身强品。

    var arr = [1, 2, 3]
    arr.forEach(function(item, index, arr){
        console.log(item, index);
    });
    //1 0
    //2 1
    //3 2
    
  8. map() 數(shù)組映射
    map映射創(chuàng)建新數(shù)組,用法: map(function(value, index, array) { … }, [thisArg] );车伞。和forEach一樣择懂,不贅述。唯一需要注意的的是回調(diào)函數(shù)需要有return值另玖,否則新數(shù)組都是undefined困曙。

    其實(shí)map能干的事forEach都能干,你可以把map理解為forEach的一個特例谦去,專門用于:通過現(xiàn)有的數(shù)組建立新數(shù)組慷丽。

    //原數(shù)組未被修改
    var arr= [1, 2, 3];
    arr.map(function(x){
        return x+10;  // 需要 return 值,否則新數(shù)組里都是 undefined
    });  // [11, 12, 13]
    arr; // [1, 2, 3]
    
  9. filter() 數(shù)組過濾
    filter用于過濾數(shù)組鳄哭,用法: filter( function(value, index, array) { … }, [thisArg] ); 要糊。唯一需要注意的的是回調(diào)函數(shù)需要return布爾值true或false,

    //原數(shù)組未被修改
    var arr= [1, 2, 3, 4, 5, 6, 7, 8];
    arr.filter(function(x,index){
        return x%2 == 0;
    }); // [2, 4, 6, 8]
    arr; // [1, 2, 3, 4, 5, 6, 7, 8]
    
  10. every() some() 數(shù)組判斷
    some表示只要某一個滿足條件就OK妆丘,every表示全部滿足條件才OK锄俄。
    用法:

    • arr.every(callback[, thisArg])
    • arr.some(callback[,thisArg])
    var arr= [1, 2, 3, 4, 5];
    arr.every(function(x){
        return x < 6;
    }); // true
    arr.every(function(x){
        return x > 6;
    }); // false
    arr.some(function(x){
        return x === 1;
    });  // true
    arr.some(function(x){
        return x === 6;
    }); // false
    
  11. reduce() reduceRight()
    reduce() 方法接收一個函數(shù)作為累加器(accumulator),數(shù)組中的每個值(從左到右)開始合并勺拣,最終為一個值奶赠。 兩者都是用于迭代運(yùn)算。區(qū)別是reduce從頭開始迭代药有,reduceRight從尾開始迭代毅戈。

    用法: reduce( function(previousValue, currentValue, currentIndex, array) { … }, [initialValue] );

    第一個參數(shù)是回調(diào)函數(shù)苹丸,有4個參數(shù):previousValue,currentValue苇经,currentIndex赘理,array∩鹊ィ看名字也能知道意思:前一個值商模,當(dāng)前值,當(dāng)前索引蜘澜,數(shù)組本身阻桅。

    第二個參數(shù)initialValue可選,表示初始值兼都。如果省略,初始值為數(shù)組的第一個元素稽寒,這樣的話回調(diào)函數(shù)里previousValue就是第一個元素扮碧,currentValue是第二個元素。因此不設(shè)initialValue的話杏糙,會少一次迭代慎王。

    //將數(shù)組所有項(xiàng)相加
    var arr = [0, 1, 2, 3];
    var sum = arr.reduce(function(a, b) {
     return a + b
    }, 0); // 6
    arr; //[0, 1, 2, 3]
    //數(shù)組扁平化
    var flattened = [[0, 1], [2, 3], [4, 5]];
    flattened.reduce(function(a,b){
        return a.concat(b);
    }); // returns [0, 1, 2, 3, 4, 5]
    
  12. indexOf() lastIndexOf() 數(shù)組檢索
    用法:indexOf( searchElement, [fromIndex = 0]) / lastIndexOf( searchElement , [fromIndex = arr.length – 1])
    第一個參數(shù)searchElement即需要查找的元素。第二個參數(shù)fromIndex可選宏侍,指定開始查找的位置赖淤。如果忽略,indexOf默認(rèn)是0谅河,lastIndexOf默認(rèn)是數(shù)組尾咱旱。
    兩者都用于返回項(xiàng)目的索引值。區(qū)別是indexOf從頭開始找绷耍,lastIndexOf從尾開始找吐限。如果查找失敗,無匹配褂始,返回-1

    var arr = ['a', 'b', 'c', 'd', 'e'];
    arr.indexOf('c');  // 2 找到返回數(shù)組下標(biāo)
    arr.indexOf('c', 3); // -1 指定從3號位開始查找
    arr.indexOf('f'); // -1 沒找到該元素
    arr.lastIndexOf('c'); // 2
    arr.lastIndexOf('c',2); // 2
    arr.lastIndexOf('f'); // -1 沒找到該元素
    
  13. isArray() 判斷是否是數(shù)組
    用法:Array.isArray(value)

    var arr = [];
    var a = "not array";
    Array.isArray(arr); // true
    Array.isArray(a); // false
    

參考資料

MDN

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诸典,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子崎苗,更是在濱河造成了極大的恐慌狐粱,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胆数,死亡現(xiàn)場離奇詭異肌蜻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)幅慌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門宋欺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事齿诞∷嵝荩” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵祷杈,是天一觀的道長斑司。 經(jīng)常有香客問我,道長但汞,這世上最難降的妖魔是什么宿刮? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮私蕾,結(jié)果婚禮上僵缺,老公的妹妹穿的比我還像新娘。我一直安慰自己踩叭,他們只是感情好磕潮,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著容贝,像睡著了一般自脯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斤富,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天膏潮,我揣著相機(jī)與錄音,去河邊找鬼满力。 笑死焕参,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的油额。 我是一名探鬼主播龟糕,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悔耘!你這毒婦竟也來了讲岁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤衬以,失蹤者是張志新(化名)和其女友劉穎缓艳,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體看峻,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阶淘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了互妓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溪窒。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡坤塞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澈蚌,到底是詐尸還是另有隱情摹芙,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布宛瞄,位于F島的核電站浮禾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏份汗。R本人自食惡果不足惜盈电,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杯活。 院中可真熱鬧匆帚,春花似錦、人聲如沸旁钧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽均践。三九已至,卻和暖如春摩幔,著一層夾襖步出監(jiān)牢的瞬間彤委,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工或衡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留焦影,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓封断,卻偏偏與公主長得像斯辰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子坡疼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

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