js基礎數(shù)組Array的一些特性及方法

@toc

前言: 工作業(yè)務數(shù)據(jù)亂,數(shù)據(jù)轉換用得繁,對接交流竟無語,全靠數(shù)組方法換;

數(shù)據(jù)的了解

js數(shù)據(jù)類型

  • 在js基礎中,我都們知道數(shù)據(jù)類型有兩大類:原始類型(基本類型)、引用類型

基本類型

js有5 種原始類型,即 Undefined、Null、Boolean、Number 和 String。其中Undefined和Null也稱作特殊類型

console.log(typeof undefined) // undefined
console.log(typeof null)   // object
console.log(typeof true)  // boolean
console.log(typeof 1)     // number
console.log(typeof '1')   // string
 

總結:基本類型,筆者就不作過多介紹具體詳情可以查閱w3school,這里解釋一下為何typeof null得出來的是object類型而不是null,因為null是一個只有一個值的特殊類型,它被認為是對象的占位符,表示一個空對象引用。

  • 在js中null == undefined 得到是真(true),盡管這兩個值相等,但它們的含義不同。 undefined 是聲明了變量但未對其初始化時賦予該變量的值,null 則用于表示尚未存在的對象(在討論 typeof 運算符時,簡單地介紹過這一點)。如果函數(shù)或方法要返回的是對象,那么找不到該對象時,返回的通常是 null。

引用類型

js中 基本類型的值基本是不可變的,但引用類型的值是動態(tài)可變的;基本類型的變量是存放在棧內存中,而引用類型的值是同時保存在棧內存和堆內存中的對象;

  • 引用類型一般指的是對象和方法;
  • 引用類型其實是在棧內存中存儲了一個指針,這個指針指向堆內存中相應的存儲地址

舉例說明:

 let arr = [1,2,3,4,5,6]
  let arr1 = arr;
  arr1.push(1)
  console.log(arr,arr1)

如上代碼:按照我們常規(guī)的想法是 arr = [1,2,3,4,5,6],arr1 = [1,2,3,4,5,6,1]的;

但實際輸出如下:


實際輸出

解釋: 上面對引用類型的定義引用類型其實是在棧內存中存儲了一個指針,這個指針指向堆內存中相應的存儲地址有講到指針的這個詞,實際上上面代碼的操作 let arr1 = arr;并不是把arr重新拷貝了一份給arr1,而是把arr存儲在堆內存的存儲地址給了arr1, 對arr1的修改,會對該地址指向的堆內存的數(shù)據(jù)進行修改,而arr和arr1指向堆內存的地址是相同的,所以打印結果一致;并且都改變了;

上述換成Object對象依然是一致的,不相信的同學可以私下試試~

數(shù)組的方法

w3school中我們可以知道數(shù)組有許多的方法,并且有些是我們經(jīng)常用到且混淆不清的,接下來我們將對數(shù)組的方法進行詳解;

1. Array.concat()

Array.concat() 的作用是連接兩個或更多的數(shù)組,并返回結果。
使用


    let arrNum = [1,2,3,4,5,6]
    let arrStr = ['1','2','3','4','5','6']
    let arrObj = [{a:1},{b:'2'}]
    let arrAll =  arrNum.concat(arrStr).concat(arrObj)
    console.log(arrAll)

輸出結果如下:


Array.concat()

此時因為concat()返回的是一個新的實例對象,對原數(shù)組操作(arrNum、arrStr)并不會影響到arrAll的值變化,但假如對arrObj進行改變,由于arrObj里面的對象屬于引用類型,arrAll相應的值的地址指針依然是同一個堆內存,假如對arrObj進行改變,arrAll也會相應改變;而arrNum、arrStr里面的值是基本類型,則不影響;

2. Array.join()

Array.join() 把數(shù)組的所有元素放入一個字符串并返回。元素通過指定的分隔符進行分隔。

  let   arrNum = [1,2,3,4,5,6]
  let   arrStr = ['1','2','3','4','5','6']
  let   arrObj = [{a:1},{b:'2'}]
  let   arrArr = [[1,2],['1','2']]
  console.log(arrNum.join('|'))
  console.log(arrStr.join(','))
  console.log(arrObj.join('-'))
  console.log(arrArr.join('='))
Array.join()
  • 返回的字符串均沒問題,但假如數(shù)組里面是object,則返回[object Object] 字符串;

3. Array.pop()

Array.pop() 向數(shù)組的末尾添加一個或更多元素,并返回新的長度。注意?。。∥臋n上沒寫明會改變原數(shù)組; 但實際上會改變

  let   arrNum = [1,2,3,4,5,6]
  let   arrStr = ['1','2','3','4','5','6']
  let   arrObj = [{a:1},{b:'2'}]
  let   arrArr = [[1,2],['1','2']]
  console.log(arrNum.pop())
  console.log(arrStr.pop())
  console.log(arrObj.pop())
  console.log(arrArr.pop())
  console.log(arrObj,arrArr)

輸出結果:


Array.pop()

4. Array.push()

Array.push() 向數(shù)組的末尾添加一個或更多元素,并返回新的長度。

本來覺得用的最多,不想作介紹了但為了加以證明引用類型引用是的存儲地址,修改原數(shù)組會導致引用相應地址的值也改變;
代碼如下:

  let   arrNum = [1,2,3,4,5,6]
  let   arrStr = ['1','2','3','4','5','6']
  let   arrObj = [{a:1},{b:'2'}]
  let   arrArr = [[1,2],['1','2']]
  let  arrAll = []
  console.log(arrAll.push(arrNum))
  console.log(arrAll.push(arrStr))
  console.log(arrAll.push(arrObj))
  console.log(arrAll.push(arrArr))
  console.log('改變前===',arrAll)
  arrNum[0] = 10000
  arrStr[0] = 10000
  arrObj[0] = 10000
  arrArr[0] = 10000
  console.log('改變后===',arrAll)
Array.push()

總結:再次證明引用類型的特點;

5. Array.reverse()

Array.reverse() 顛倒數(shù)組中元素的順序。

  let   arrNum = [1,2,3,4,5,6]
  let   arrStr = ['1','2','3','4','5','6']
  let   arrObj = [{a:1},{b:'2'}]
  let   arrArr = [[1,2],['1','2']]
  console.log(arrNum.reverse())
  console.log(arrStr.reverse())
  console.log(arrObj.reverse())
  console.log(arrArr.reverse())

常規(guī)使用,毫無問題


Array.reverse()

6. Array.shift()

Array.shift() 刪除并返回數(shù)組的第一個元素,具體表現(xiàn)和上面的 3. Array.pop() 完全類似,同樣會改變原數(shù)組,不作過多介紹;

7. Array.unshift()

Array.unshift()向數(shù)組的開頭添加一個或更多元素,并返回新的長度。

用法:

arrayObject.unshift(val1,val2,....,valn)

參數(shù)解釋:

  • val1 必需。向數(shù)組添加的第一個元素。
  • val2 可選。向數(shù)組添加的第二個元素。
  • valn 可選。向數(shù)組添加的第n個元素。

注意:unshift() 方法將把它的參數(shù)插入 arrayObject 的頭部,并將已經(jīng)存在的元素順次地移到較高的下標處,以便留出空間。該方法的第一個參數(shù)將成為數(shù)組的新元素 0,如果還有第二個參數(shù),它將成為新的元素 1,以此類推。并且 unshift() 方法不創(chuàng)建新的創(chuàng)建,而是直接修改原有的數(shù)組。
使用如下:

    let arrNum = [1,2,3,4,5,6]
    let arrStr = ['1','2','3','4','5','6']
    let arrObj = [{a:1},{b:'2'}]
    let arrArr = [[1,2],['1','2']]
    console.log(arrNum.unshift(1,2,3,4,5,6))
    console.log(arrStr.unshift('1','2','3','4','5','6'))
    console.log(arrObj.unshift({a:1},{b:'2'}))
    console.log(arrArr.unshift([1,2],['1','2']))
    console.log(arrNum,arrStr,arrObj,arrArr)

輸出:


Array.unshift()

8. Array.slice()

Array.slice() 方法可從已有的數(shù)組中返回選定的元素。

用法:

arrayObject.slice(start,end)

參數(shù)解釋:

  • start : 必需。規(guī)定從何處開始選取。如果是負數(shù),那么它規(guī)定從數(shù)組尾部開始算起的位置。也就是說,-1 指最后一個元素,-2 指倒數(shù)第二個元素,以此類推。
  • end : 可選。規(guī)定從何處結束選取。該參數(shù)是數(shù)組片斷結束處的數(shù)組下標。如果沒有指定該參數(shù),那么切分的數(shù)組包含從 start 到數(shù)組結束的所有元素。如果這個參數(shù)是負數(shù),那么它規(guī)定的是從數(shù)組尾部開始算起的元素。
  • 返回值 :返回一個新的數(shù)組,包含從 start 到 end (不包括該元素)的 arrayObject 中的元素。
    使用
  let   arrNum = [1,2,3,4,5,6]
  let   arrStr = ['1','2','3','4','5','6']
  let   arrObj = [{a:1},{b:'2'}]
  let   arrArr = [[1,2],['1','2']]
  console.log(arrNum.slice(0,1))
  console.log(arrStr.slice(0,1))
  console.log(arrObj.slice(0,1))
  console.log(arrArr.slice(0,1))
  console.log(arrNum,arrStr,arrObj,arrArr)

輸出如下:


Array.slice()

注意: 該方法并不會修改原數(shù)組,而是返回一個子數(shù)組

9. Array.splice()

Array.splice() 方法向/從數(shù)組中添加/刪除項目,然后返回被刪除的項目。

用法:


arrayObject.splice(index,delLong,item1,.....,itemN)

參數(shù)解釋:

  • index : 必需。整數(shù),規(guī)定添加/刪除項目的位置,使用負數(shù)可從數(shù)組結尾處規(guī)定位置。
  • delLong :必需。要刪除的項目數(shù)量。如果設置為 0,則不會刪除項目。
  • item1, ..., itemN :可選。向數(shù)組添加的新項目。

注意: splice() 方法可刪除從 index 處開始的零個或多個元素,并且用參數(shù)列表中聲明的一個或多個值來替換那些被刪除的元素。

如果從 arrayObject 中刪除了元素,則返回的是含有被刪除的元素的數(shù)組。

使用:

  let   arrNum = [1,2,3,4,5,6]
  let   arrStr = ['1','2','3','4','5','6']
  let   arrObj = [{a:1},{b:'2'}]
  let   arrArr = [[1,2],['1','2']]
  console.log(arrNum.splice(-1,1,10000))
  console.log(arrStr.splice(0,0,'10000'))
  console.log(arrObj.splice(0,1))
  console.log(arrArr.splice(0,1))
  console.log(arrNum,arrStr,arrObj,arrArr)

結果如下:


image.png

注意: 該方法會修改原數(shù)組,而是返回一個子數(shù)組。如果從 arrayObject 中刪除了元素,則返回的是含有被刪除的元素的數(shù)組。如果未刪除,則返回空數(shù)組;

總結: slice()和splice()容易混淆,不過這樣記就好:單詞長的參數(shù)也長,參數(shù)長的功能大,可加可減可改變

9. Array.sort()

Array.sort() 方法用于對數(shù)組的元素進行排序。

用法:

arrayObject.sort(sortby)

參數(shù)解釋:

  • sortby : 可選。規(guī)定排序順序。必須是函數(shù)。

使用:

let arrNum = [6,2,1,3,4,5]
  let   arrStr = ['6','2','1','3','4','5']
  let   arrObj = [{b:'2'},{a:1}]
  let   arrArr = [['2','1'],[2,1]]
  console.log(arrNum.sort())
  console.log(arrStr.sort())
  console.log(arrObj.sort())
  console.log(arrArr.sort())
  console.log(arrNum,arrStr,arrObj,arrArr)
    var arr = [1,2,4,3,2,1]

    console.log(arr.sort(function (m,n) {
    if (m < n) return -1
    if (m > n) return 1
    if (m == n)return 0
  }))

結果如下:


Array.sort()

總結:實際上上面代碼寫的方法就是sort()默認的方法;方法可以自定義;

最后數(shù)組方法的擴展

從字面認知:every是每一個都,some是都有一些就~~
即:

  1. every():方法用于檢測數(shù)組中所有元素是否都符合指定條件,若符合返回true,否則返回false;
  2. some():方法用于檢測數(shù)組中的元素是否有滿足指定條件的,若滿足返回true,否則返回false;

every()

// every():方法用于檢測數(shù)組中所有元素是否都符合指定條件,若符合返回true,否則返回false,且程序不會繼續(xù)往下執(zhí)行;
array.every(function(item,index,array){
                 // item:當前元素的值;

                 // index:當前元素的索引;

                 // array:當前元素的數(shù)組對象;

         })

例子:
//es6
let age = [10,20,30,40,50,22,26]
 // 所有都滿足才會返回true,否則返回false;
 let result = age.every((item,index,array)=>{
 console.log(item) // 10
 console.log(index) // 0
 console.log(array) //[10,20,30,40,50,22,26]

     return item > 22;
    })

// es5
// let result = age.every(function(item,index,array){
//     return item > 22;
//  })
    console.log(result) // false

some()

// some():方法用于檢測數(shù)組中是否有元素符合指定條件,若有符合的返回true,且程序不會繼續(xù)往下執(zhí)行;否則返回false;
array.some(function(item,index,array){
                 // item:當前元素的值;

                 // index:當前元素的索引;

                 // array:當前元素的數(shù)組對象;

         })

例子:
//es6
let age = [10,20,30,40,50,22,26]
 // 所有都滿足才會返回true,否則返回false;
 let result = age.some((item,index,array)=>{

  console.log(item) // 10 20 30
  console.log(index) // 0 1 2
  console.log(array) //[10,20,30,40,50,22,26]


     return item > 22;
    })

// es5
// let result = age.some(function(item,index,array){
//     return item > 22;
//  })
    console.log(result) // true

以上就是js基礎中 數(shù)組常用的方法,特別要注意的是splice和slice容易混淆,其他的話,用過幾次就基本沒有問題了,此次代碼已經(jīng)上傳到github,有興趣可以去下載實現(xiàn)一波喔@王一諾wLove-c/JavaScript-demo,如果對你有幫助,請點個贊吧;

更多內容請轉作者博客@王一諾的博客,多多交流~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容