前端之路——JavaScript中的Array(2)

數(shù)組的實(shí)例屬性和方法

實(shí)例屬性

  • length 數(shù)組中元素的個(gè)數(shù), 需要注意的是续徽,通過(guò)索引為數(shù)組賦值會(huì)改變數(shù)組的長(zhǎng)度
    let a = [ 1, 2 ]
    console.log(a.length) // 2
    a[1000] = 1
    console.log(a.length) // 10001

實(shí)例方法

區(qū)分?jǐn)?shù)組和Array

  • 數(shù)組是調(diào)用Array后得到的對(duì)象實(shí)例买乃,Array是該實(shí)例的構(gòu)造函數(shù)

  • 該實(shí)例的原型不是Array,而是Array.prototype,即對(duì)象實(shí)例的原型是該對(duì)象實(shí)例的構(gòu)造函數(shù)的prototype屬性

    let a = []
    a.__proto__ === Array.prototype  // true

數(shù)組常用方法

  • 數(shù)組的方法都是繼承自原型對(duì)象——Array.prototype

  • 一般而言铛纬,為了降低編程的復(fù)雜度嫉戚,傾向于使用unmutable(不可變)的方法,基于此维贺,對(duì)數(shù)組的實(shí)例方法分類

  • 返回新數(shù)組的方法

    • concat
      合并多個(gè)數(shù)組袜啃,返回的新數(shù)組是對(duì)原始數(shù)組的淺拷貝
        let e1 = { foo: 'foo' }
        let e2 = { bar: 'bar' }
        let a1 = [e1]
        let a2 = [e2]
        let a3 = a1.concat(e2)
        console.log(a3)     // [{ foo: 'foo' }, { bar: 'bar' }]
        e1.foo = 'bar'
        console.log(a3)     // [{ foo: 'bar' }, { bar: 'bar' }]
    
    • entries
      返回一個(gè)新的iterator對(duì)象。iterator對(duì)象有一個(gè)next方法幸缕,返回值為有valuedone屬性的對(duì)象群发,done標(biāo)識(shí)該
      iterator是否已經(jīng)迭代完畢
        let a = [1, 2, 3]
        let it = a.entries
        it.next()  // { value: [0, 1], done: false }
        it.next()  // { value: [1, 2], done: false }
        it.next()  // { value: [2, 3], done: false }
        it.next()  // { value: undefined, done: true }
    
    • every
      測(cè)試數(shù)組中是否所有元素都滿足測(cè)試條件,參數(shù)為返回boolean的測(cè)試函數(shù)
      只要有一個(gè)元素不滿足測(cè)試條件发乔,該方法返回false熟妓,否則返回true。
      對(duì)空數(shù)組([])調(diào)用會(huì)返回true
        [1, 2, 3].every(function(e) {
            return e > 1
        })      // false
    
    • filter
      篩選栏尚,參數(shù)為返回boolean的測(cè)試函數(shù)起愈,返回滿足條件的元素組成的新數(shù)組,若沒(méi)有滿足條件的元素译仗,則返回空數(shù)組
        const a = [10, 5, 8]
        let b = a.every(function(e, index) {
            return e > 5
        }) // [10, 8]
    
    • find
      查找抬虽,參數(shù)為返回boolean的測(cè)試函數(shù),返回第一個(gè)滿足條件的元素纵菌,若沒(méi)有滿足條件的元素阐污,則返回undefined
        const a = [
            {
                id: 1
            },
            {
                id: 2
            },
            {
                id: 3
            }
        ]
        let b = a.every(function(e, index) {
            return e.id > 1
        }) // { id: 2 }
    
    • findIndex
      查找下標(biāo),參數(shù)為返回boolean的測(cè)試函數(shù)咱圆,返回第一個(gè)滿足條件的元素的下標(biāo)笛辟,若沒(méi)有滿足條件的元素,則返回-1
        const a = [
            { id: 1 },
            { id: 2 },
            { id: 3 }
        ]
        let b = a.every(function(e, index) {
            return e.id > 1
        }) // 1
    
    • flat
      扁平化數(shù)組序苏,參數(shù)為深度(默認(rèn)為1)手幢,根據(jù)深度將所有元素及其子數(shù)組合并為一個(gè)新的數(shù)組。
      使用Infinity作為參數(shù)可以展開(kāi)任意深度的嵌套數(shù)組
        const a = [1, 2, [3, 4, [5, 6]]]
        a.flat(2)    // [1, 2, 3, 4, 5, 6]
        a.flat(Infinity)     // [1, 2, 3, 4, 5, 6]
    
    • flatMap
      映射+扁平化忱详,參數(shù)為映射函數(shù)围来,即對(duì)映射后的中間數(shù)組調(diào)用flat(1)
        const a = [1, 2, [3, 4, [5, 6]]]
        a.flatMap(function(e) {
            return e
        })    // [1, 2, 3, 4, [5, 6]]
    
    • forEach
      對(duì)每個(gè)元素執(zhí)行一次映射函數(shù),參數(shù)為映射函數(shù)
        const a = [1, 2, 3]
        a.forEach(function(e) {
            console.log(e)
        })
        // 1
        // 2
        // 3
    
    • includes
      測(cè)試一個(gè)數(shù)組是否包含指定元素,參數(shù)為待查找元素监透,可選的第二個(gè)參數(shù)為開(kāi)始查找的下標(biāo)桶错,默認(rèn)為0
      檢測(cè)-0 和 0,NaN 和 NaN會(huì)返回true
        const a = [1, 2, 0, NaN]
        a.includes(2)   // true
        a.includes(-0)  // true
        a.includes(NaN)  // true
    
    • indexOf
      查找一個(gè)給定元素的第一個(gè)索引才漆,參數(shù)為待查找元素牛曹,若未找到,則返回-1
      這里使用的是嚴(yán)格相等(類似===)
        const a = [1, 2, 3]
        a.indexOf(2)   // 1
    
    • join
      返回由參數(shù)連接符的數(shù)組元素組成的字符串醇滥,參數(shù)為連接符黎比,默認(rèn)為,,對(duì)空數(shù)組返回空字符串
        const a = [1, 2, 3]
        a.join('+')   // "1+2+3"
    
    • keys
      返回包含數(shù)組中每個(gè)索引鍵的iterator對(duì)象
        const a = [1, 2, 3]
        const it = a.keys()
        it.next()   // { value: 0, done: false }
        it.next()   // { value: 1, done: false }
        it.next()   // { value: 2, done: false }
        it.next()   // { value: undefined, done: true }
    
    • lastIndexOf
      與indexOf類似鸳玩,區(qū)別是從后往前找

    • map
      根據(jù)映射函數(shù)阅虫,返回一個(gè)新數(shù)組,其中的元素是原數(shù)組中每個(gè)元素調(diào)用映射函數(shù)后的返回值

        const a = [1, 2, 3]
        a.map(function(e) {
            return 2 * e
        })  // [2, 4, 6]
    
    • reduce
      對(duì)數(shù)組中的每個(gè)元素執(zhí)行reduce函數(shù)不跟,將其結(jié)果返回成單個(gè)值颓帝,參數(shù)為reduce函數(shù)和初始值initialValue, 第二個(gè)參數(shù)是可選的
      reduce函數(shù)的第一個(gè)參數(shù)是上一次調(diào)用reduce函數(shù)的返回值,第二個(gè)參數(shù)是當(dāng)前調(diào)用reduce函數(shù)對(duì)應(yīng)的數(shù)組元素
      在第一次執(zhí)行reduce函數(shù)時(shí)窝革,
      • 如果提供了initialValue购城,則reduce函數(shù)的accumulator值為initialValuecurrentValue為第一個(gè)元素
      • 如果沒(méi)有提供initialValue虐译,則reduce函數(shù)的accumulator值為數(shù)組的第一個(gè)元素瘪板,currentValue為第二個(gè)元素
      • 如果數(shù)組為空,且沒(méi)有提供initialValue漆诽,則拋出異常
        所以提供初始值是較好的做法
        const a = [1, 2, 3]
        a.reduce(function(accumulator, currentValue) {
            return accumulator + currentValue
        })  // 6
        a.reduce(function(accumulator, currentValue) {
            return accumulator + currentValue
        }, 10)  // 16
    
    • reduceRight
      同reduce類似侮攀,區(qū)別在于從右到左開(kāi)始執(zhí)行reduce函數(shù)

    • slice
      返回一個(gè)新的數(shù)組對(duì)象,長(zhǎng)度由參數(shù)beginend決定

      • 省略begin厢拭,則從0開(kāi)始,若begin為負(fù)數(shù)供鸠,如-2畦贸,則從倒數(shù)第2個(gè)元素開(kāi)始
      • 省略end,則默認(rèn)為數(shù)組長(zhǎng)度
      • endbegin的左邊回季,則返回空數(shù)組
        [1, 2, 3].slice(1)      // [2, 3]
        [1, 2, 3].slice(-1)     // [3]
        [1, 2, 3].slice(1, 0)     // []
    
    • some
      測(cè)試是否至少有一個(gè)元素滿足測(cè)試函數(shù)家制,與every類似,區(qū)別在于只要有一個(gè)元素滿足測(cè)試函數(shù)泡一,就返回true
        [1, 2, 3].some(function(e) {
            return e > 1
        })      // true
        [1, 2, 3].every(function(e) {
            return e > 1
        })      // true
    
    • values
      與keys類似,只不過(guò)迭代器的value為數(shù)組的元素觅廓,而不是下標(biāo)
  • 修改原數(shù)組的方法

    • fill
      使用固定的值填充數(shù)組鼻忠,第一個(gè)參數(shù)是待填充的值,起始位置和結(jié)束位置是可選的
      類似這種指明起始和結(jié)束位置的參數(shù),不提供結(jié)束參數(shù)則默認(rèn)到數(shù)組的length帖蔓,并且不包括結(jié)束位置
        [1, 2, 3].fill(4)   // [4, 4, 4]
    
    • pop
      刪除數(shù)組最后一個(gè)元素矮瘟,并返回該元素,該方法會(huì)修改原數(shù)組的長(zhǎng)度
        [1, 2, 3].pop()   // 3
    
    • push
      將一個(gè)或多個(gè)元素添加到數(shù)組的末尾, 返回?cái)?shù)組的新長(zhǎng)度
        [1, 2, 3].push(4, 5, 7)   // 6
    
    • reverse
      將一個(gè)數(shù)組中的元素反序
        [1, 2, 3].reverse()   // [3, 2, 1]
    
    • shift
      與pop類似塑娇,區(qū)別是刪除數(shù)組中的第一個(gè)元素澈侠,并返回該元素
        [1, 2, 3].shift()   // 1
    
    • sort
      排序,可傳入排序函數(shù)埋酬,默認(rèn)會(huì)將元素轉(zhuǎn)換成字符串再按照Unicode位點(diǎn)排序
      • 比較函數(shù)返回-1哨啃,0,1写妥,表示小于拳球,等于,大于
        [10, 200, 3, 9, 81].sort()   // [10, 200, 3, 81, 9]
        [10, 200, 3, 9, 81].sort(function(e1, e2) {
            return e1 - e2
        })
    
    • splice
      刪除或替換現(xiàn)有元素或者原地添加新的元素來(lái)修改數(shù)組, 返回被刪除元素組成的數(shù)組
      • 第一個(gè)參數(shù)start是操作開(kāi)始的位置
      • 第二個(gè)參數(shù)deleteCount為要?jiǎng)h除元素的個(gè)數(shù)珍特,若不指定祝峻,則刪除從start開(kāi)始刪除剩余所有元素,若小于等于零扎筒,則不刪除
      • 從第三個(gè)參數(shù)開(kāi)始莱找,為要添加的元素
        let a = [1, 2, 3]
        a.splice(1)     // 返回[2, 3]   a = [1]
        a = [1, 2, 3]
        a.splice(1, 1)     // 返回[2]   a = [1, 3]
        a = [1, 2, 3]
        a.splice(1, 1, 11)  // 返回[2]  a = [1, 11, 3]
    
    • unshift
      將一個(gè)或多個(gè)元素添加到數(shù)組的開(kāi)頭,并返回該數(shù)組的新長(zhǎng)度
        let a = [1, 2, 3]
        a.unshift(4, 5)     // 返回5 a = [4, 5, 1, 2, 3]
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嗜桌,一起剝皮案震驚了整個(gè)濱河市奥溺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌症脂,老刑警劉巖谚赎,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異诱篷,居然都是意外死亡壶唤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)棕所,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)闸盔,“玉大人,你說(shuō)我怎么就攤上這事琳省∮常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵针贬,是天一觀的道長(zhǎng)击费。 經(jīng)常有香客問(wèn)我,道長(zhǎng)桦他,這世上最難降的妖魔是什么蔫巩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上圆仔,老公的妹妹穿的比我還像新娘垃瞧。我一直安慰自己,他們只是感情好坪郭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布个从。 她就那樣靜靜地躺著,像睡著了一般歪沃。 火紅的嫁衣襯著肌膚如雪嗦锐。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天绸罗,我揣著相機(jī)與錄音意推,去河邊找鬼。 笑死珊蟀,一個(gè)胖子當(dāng)著我的面吹牛菊值,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播育灸,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼腻窒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了磅崭?” 一聲冷哼從身側(cè)響起儿子,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砸喻,沒(méi)想到半個(gè)月后柔逼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡割岛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年愉适,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癣漆。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡维咸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惠爽,到底是詐尸還是另有隱情癌蓖,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布婚肆,位于F島的核電站租副,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏较性。R本人自食惡果不足惜附井,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一讨越、第九天 我趴在偏房一處隱蔽的房頂上張望两残。 院中可真熱鬧永毅,春花似錦、人聲如沸人弓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)崔赌。三九已至意蛀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間健芭,已是汗流浹背县钥。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慈迈,地道東北人若贮。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像痒留,于是被迫代替她去往敵國(guó)和親谴麦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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