A25-JS數(shù)組

  • Array -MDN

    window.Array 全局對象(也是函數(shù))
    • 基本用法:

      var a = Array(3)  // {length: 3}
      a.length // 3
      0 in a // false, 數(shù)組 a 里面并沒有 0 這個 key
      a[0] // undefined
      a.push('three')
      3 in a // true
      a[3] // 'three'
      
      var a2 = Array(3,3) // [3,3]
      a2.length // 2
      0 in a2 // true
      a2[0] // 3 
      // 當(dāng)括號里只有一個數(shù)字參數(shù)的時候莫杈,它是長度,當(dāng)參數(shù)不止一個的時候它是參數(shù)
      // 這叫做不一致性跷究,這不是一件好事
      
      new Array(3) 跟不加 new 一樣的效果
      new Array(3,3,) 跟不加 new 一樣的效果
      
      var a = [1,2,3] // 常用簡寫方式
      
    • 加不加new對不同類型的區(qū)別:

      • String姓迅、Number、Boolean
        String()返回基本類型
        new String()返回對象
      • Object俊马、Array丁存、Function
        Object()返回對象
        new Object()返回依然是對象
    • 數(shù)組為什么是數(shù)組而不是對象是因?yàn)閿?shù)組有著對象沒有的特點(diǎn)
      也就是你的對象的__proto__指向的是否是Array.prototype

    • 數(shù)組的一個特征
      數(shù)組之所以是數(shù)組,其實(shí)是因?yàn)槟惆阉鼣?shù)組

      var a = [1,2,3]
      a.x = 'x'
      a.y = 'y'
      for(let i=0; i < a.length; i++){ // 這種方法遍歷排除了 x柴我、y
        console.log(a[i]) // 1, 2, 3
      }
      for(let key in a){
        console.log(key) // 0, 1, 2, x, y
      }
      var obj = {
        0: 1, 1: 2, 2: 3, length: 3
      }
      for(let i=0; i < obj.length; i++){
        console.log(obj[i]) // 1, 2, 3
      }
      
    • 偽數(shù)組
      上面的obj對象就是偽數(shù)組解寝;它不關(guān)心你有沒有數(shù)組的那些方法,只需要012345……這些下標(biāo)去遍歷
      只要你的原型鏈中沒有Array.prototype就是偽數(shù)組
      目前JS中只有一種偽數(shù)組艘儒,就是arguments

      function f(){ console.dir(arguments) }
      f(1,2,3)
      

      從下圖可以看見它引用的是Object.protype而非Array.prototype

    • forEachAPI -MDN阮一峰
      forEach() 方法對數(shù)組的每個元素執(zhí)行一次提供的函數(shù)聋伦。
      語法:

      array.forEach(callback(currentValue, index, array){
          //do something
      }, this)
      
      array.forEach(callback[, thisArg])
      
      // Eg
      const arr = ['a', 'b', 'c'];
      
      arr.forEach(function(element) {
          console.log(element);
      });  
      arr.forEach( element => console.log(element));
      // a
      // b
      // c
      
      // 上面我們并沒有將arr傳進(jìn)forEach里面但是為什么還能調(diào)用
      // 可以這么理解
      // 用this來獲取夫偶,比如
      var obj = { 0:'a', 1:'b', length:2 }
      obj.forEach = function(fn){
        for(let i=0; i < this.length; i++){
          fn(this[i], i, this)
        }
      }
      

      參數(shù):
      callback
      為數(shù)組中每個元素執(zhí)行的函數(shù),該函數(shù)接收三個參數(shù):
      currentValue(當(dāng)前值)
      數(shù)組中正在處理的當(dāng)前元素觉增。
      index(索引)
      數(shù)組中正在處理的當(dāng)前元素的索引兵拢。
      array
      forEach()方法正在操作的數(shù)組。
      thisArg可選
      可選參數(shù)逾礁。當(dāng)執(zhí)行回調(diào) 函數(shù)時用作this的值(參考對象)说铃。
      返回值:undefined.

    • sort() -MDN阮一峰
      sort方法對數(shù)組成員進(jìn)行排序,默認(rèn)排序順序是根據(jù)字符串Unicode碼點(diǎn)嘹履。 sort 排序不一定是穩(wěn)定的排序后腻扇,原數(shù)組將被改變。

      ['d', 'c', 'b', 'a'].sort()
      // ['a', 'b', 'c', 'd']
      
      [4, 3, 2, 1].sort()
      // [1, 2, 3, 4]
      
      var fruit = ['cherries', 'apples', 'bananas'];
      fruit.sort(); 
      // ['apples', 'bananas', 'cherries']
      
      var scores = [1, 10, 21, 2]; 
      scores.sort(); 
      // [1, 10, 2, 21]
      // 注意10在2之前,
      // 因?yàn)樵?Unicode 指針順序中"10"在"2"之前
      
      var things = ['word', 'Word', '1 Word', '2 Words'];
      things.sort(); 
      // ['1 Word', '2 Words', 'Word', 'word']
      // 在Unicode中, 數(shù)字在大寫字母之前,
      // 大寫字母在小寫字母之前.
      

      語法:
      arr.sort()
      arr.sort(compareFunction)
      參數(shù):
      compareFunction
      可選砾嫉。用來指定按某種順序進(jìn)行排列的函數(shù)幼苛。如果省略,元素按照轉(zhuǎn)換為的字符串的各個字符的Unicode位點(diǎn)進(jìn)行排序焕刮。
      返回值: 返回排序后的數(shù)組舶沿。原數(shù)組已經(jīng)被排序后的數(shù)組代替。
      描述:
      如果沒有指明 compareFunction 济锄,那么元素會按照轉(zhuǎn)換為的字符串的諸個字符的 Unicode 位點(diǎn)進(jìn)行排序暑椰。例如 "Banana" 會被排列到 "cherry" 之前霍转。當(dāng)數(shù)字按由小到大排序時荐绝,9 出現(xiàn)在 80 之前,但因?yàn)椋]有指明 compareFunction)避消,比較的數(shù)字會先被轉(zhuǎn)換為字符串低滩,所以在Unicode順序上 "80" 要比 "9" 要靠前。
      如果指明了 compareFunction 岩喷,那么數(shù)組會按照調(diào)用該函數(shù)的返回值排序恕沫。即 a 和 b 是兩個將要被比較的元素:

      • 如果 compareFunction(a, b) 小于 0 ,那么 a 會被排列到 b 之前纱意;
      • 如果 compareFunction(a, b) 大于 0 婶溯, b 會被排列到 a 之前
      • 如果 compareFunction(a, b) 等于 0 , a 和 b 的相對位置不變
      • compareFunction(a, b) 必須總是對相同的輸入返回相同的比較結(jié)果偷霉,否則排序的結(jié)果將是不確定的迄委。
      // 對數(shù)字排序
      var a = [5,6,4,1,2,3]
      // 升序
      function up(a, b) {
        if (a < b ) {           // 按某種排序標(biāo)準(zhǔn)進(jìn)行比較, a 小于 b
          return -1;
        }
        if (a > b ) {
          return 1;
        }
        // a must be equal to b
        return 0;
      }
      // 更簡潔的寫法
      function up(a,b){
        return a-b
      }
      a.sort(up) // 1,2,3,4,5,6
      
      // 降序
      function down(a,b){
        return b-a
      }
      

      js內(nèi)置的排序一般都是快排

    • join() -MDN
      join() 方法將一個數(shù)組(或一個類數(shù)組對象)的所有元素連接成一個字符串并返回這個字符串。
      和sort()方法不同类少,它不會改變原有的數(shù)組
      語法:

      str = arr.join()
      // 默認(rèn)為 ","
      
      str = arr.join("")
      // 分隔符 === 空字符串 ""
      
      str = arr.join(separator)
      // 分隔符
      

      參數(shù):
      separator
      指定一個字符串來分隔數(shù)組的每個元素叙身。
      如果需要(separator),將分隔符轉(zhuǎn)換為字符串硫狞。
      如果省略()信轿,數(shù)組元素用逗號分隔晃痴。默認(rèn)為 ","。
      如果separator是空字符串("")财忽,則所有元素之間都沒有任何字符倘核。
      返回值
      一個所有數(shù)組元素連接的字符串。如果 arr.length 為0即彪,則返回空字符串

      // Eg
      let a = ['Wind', 'Rain', 'Fire'];
      
      console.log(a.join()); 
      // 默認(rèn)為 ","
      // 'Wind,Rain,Fire'
      
      console.log(a.join("")); 
      // 分隔符 === 空字符串 ""
      // "WindRainFire"
      
      console.log(a.join("-")); 
      // 分隔符 "-"
      // 'Wind-Rain-Fire'
      
    • concat() -MDN
      concat() 方法用于合并兩個或多個數(shù)組笤虫。此方法不會更改現(xiàn)有數(shù)組,而是返回一個新數(shù)組祖凫。
      語法:
      var new_array = old_array.concat(value1[, value2[, ...[, valueN]]])
      參數(shù):valueN
      將數(shù)組和/或值連接成新數(shù)組琼蚯。
      返回值:新的 Array 實(shí)例。

      var arr1 = ['a', 'b', 'c'];
      var arr2 = ['d', 'e', 'f'];
      
      var arr3 = arr1.concat(arr2);
      
      // arr3 is a new array [ "a", "b", "c", "d", "e", "f" ]
      
      // 使用 concat 來復(fù)制一個數(shù)組
      var a = [1,2,3]
      bar b = a.concat([])
      a === b // false
      
    • map() -MDN阮一峰
      map() 方法創(chuàng)建一個新數(shù)組惠况,其結(jié)果是該數(shù)組中的每個元素都調(diào)用一個提供的函數(shù)后返回的結(jié)果遭庶。
      map與forEach類似,不同的是它返回一個新數(shù)組稠屠,而forEach返回undefined峦睡。
      語法:

      let new_array = arr.map(function callback(currentValue, index, array) { 
          // Return element for new_array 
      }[, thisArg])
      
      // Eg
      var numbers = [1, 2, 3];
      
      numbers.map(function (n) {
        return n + 1;
      });
      // [2, 3, 4]
      
      numbers
      // [1, 2, 3]
      

      參數(shù):
      callback
      生成新數(shù)組元素的函數(shù),使用三個參數(shù):
      currentValue
      callback 的第一個參數(shù)权埠,數(shù)組中正在處理的當(dāng)前元素榨了。
      index
      callback 的第二個參數(shù),數(shù)組中正在處理的當(dāng)前元素的索引攘蔽。
      array
      callback 的第三個參數(shù)龙屉,map 方法被調(diào)用的數(shù)組。
      thisArg
      可選的满俗。執(zhí)行 callback 函數(shù)時 使用的this 值转捕。
      返回值:
      一個新數(shù)組,每個元素都是回調(diào)函數(shù)的結(jié)果唆垃。

    • filter() -MDN
      filter() 方法創(chuàng)建一個新數(shù)組, 其包含通過所提供函數(shù)實(shí)現(xiàn)的測試的所有元素五芝。
      語法:
      var new_array = arr.filter(callback[, thisArg])
      返回值: 一個新的通過測試的元素的集合的數(shù)組
      ES6:
      let [...spread]= [12, 5, 8, 130, 44];
      等同于:let spread = 淺克隆([12, 5, 8, 130, 44])

      function isBigEnough(value) {
        return value >= 10;
      }
      
      var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
      
      // filtered is [12, 130, 44]
      
      // ES6 way
      
      const isBigEnough = value => value >= 10; // 這里用的箭頭函數(shù)
      
      let [...spread]= [12, 5, 8, 130, 44];
      
      let filtered = spread.filter(isBigEnough);
      
      // filtered is [12, 130, 44]
      
    • reduce() -MDN
      reduce() 方法對累加器和數(shù)組中的每個元素(從左到右)應(yīng)用一個函數(shù),將其減少為單個值辕万。
      語法:arr.reduce(callback(accumulator,currentValue)[, initialValue])
      參數(shù)
      callback
      執(zhí)行數(shù)組中每個值的函數(shù)枢步,包含四個參數(shù):
      accumulator
      累加器累加回調(diào)的返回值; 它是上一次調(diào)用回調(diào)時返回的累積值,或initialValue(如下所示)渐尿。

      currentValue
      數(shù)組中正在處理的元素醉途。
      currentIndex
      數(shù)組中正在處理的當(dāng)前元素的索引。 如果提供了initialValue涡戳,則索引號為0结蟋,否則為索引為1。
      array
      調(diào)用reduce的數(shù)組
      initialValue
      可選,用作第一個調(diào)用callback的第一個參數(shù)的值渔彰。 如果沒有提供初始值嵌屎,則將使用數(shù)組中的第一個元素推正。在沒有初始值的空數(shù)組上調(diào)用 reduce 將報錯。
      返回值: 函數(shù)累計處理的結(jié)果

      var total = [0, 1, 2, 3].reduce(function(sum, value) {
        return sum + value;
      }, 0);
      // total is 6
      
      var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
        return a.concat(b);
      }, []);
      // flattened is [0, 1, 2, 3, 4, 5]
      
      // 使用 reduce 表示 map
      var a = [1,2,3]
      a.map(function(value){
        return value * 2
      })
      
      a.reduce(function(arr, n){
        arr.push(n*2)
        return arr
      }, [])
      
      // 使用 reduce 表示 filter
      var b = [1,2,3,4,5,6,7,8,9,10]
      b.filter(function(value){
        return value % 2 === 0
      })
      
      b.reduce(function(arr, n){
        if(n % 2 === 0){
          arr.push(n)
        }
        reruen arr
      },[])
      
  • Function -MDN

    // 常用簡寫方式
    var f = function(a,b){
      return a+b
    }
    
    var f = new Function('a', 'b', 'return a+b') //使用 new 進(jìn)行構(gòu)造宝惰,
    var f = new Function(['a','b'],'return a+b')
    

    語法:new Function ([arg1[, arg2[, ...argN]],] functionBody)
    參數(shù):
    arg1, arg2, ... argN
    被函數(shù)使用的參數(shù)的名稱必須是合法命名的植榕。參數(shù)名稱是一個有效的JavaScript標(biāo)識符的字符串,或者一個用逗號分隔的有效字符串的列表;例如“×”尼夺,“theValue”尊残,或“A,B”淤堵。
    functionBody
    一個含有包括函數(shù)定義的JavaScript語句的字符串

    函數(shù)總是會返回一個值

    function fn(){
      console.log('函數(shù)')
      return undefined // 如果你不寫就會自動添加這樣的一句
    }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寝衫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拐邪,更是在濱河造成了極大的恐慌慰毅,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扎阶,死亡現(xiàn)場離奇詭異汹胃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)东臀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門着饥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惰赋,你說我怎么就攤上這事宰掉。” “怎么了谤逼?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵贵扰,是天一觀的道長仇穗。 經(jīng)常有香客問我流部,道長,這世上最難降的妖魔是什么纹坐? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任枝冀,我火速辦了婚禮,結(jié)果婚禮上耘子,老公的妹妹穿的比我還像新娘果漾。我一直安慰自己,他們只是感情好谷誓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般贪婉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸵钝,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機(jī)與錄音庐镐,去河邊找鬼恩商。 笑死,一個胖子當(dāng)著我的面吹牛必逆,可吹牛的內(nèi)容都是我干的怠堪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼名眉,長吁一口氣:“原來是場噩夢啊……” “哼粟矿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起损拢,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嚷炉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后探橱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體申屹,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年隧膏,在試婚紗的時候發(fā)現(xiàn)自己被綠了哗讥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡胞枕,死狀恐怖杆煞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腐泻,我是刑警寧澤决乎,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站派桩,受9級特大地震影響构诚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜铆惑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一范嘱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧员魏,春花似錦丑蛤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至虏束,卻和暖如春棉饶,著一層夾襖步出監(jiān)牢的瞬間脑慧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工砰盐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闷袒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓岩梳,卻偏偏與公主長得像囊骤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冀值,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

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