@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)
輸出結果如下:

此時因為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('='))

- 返回的字符串均沒問題,但假如數(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)
輸出結果:

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)

總結:再次證明引用類型的特點;
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ī)使用,毫無問題

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)
輸出:

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)
輸出如下:

注意: 該方法并不會修改原數(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)
結果如下:

注意: 該方法會修改原數(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
}))
結果如下:

總結:實際上上面代碼寫的方法就是sort()默認的方法;方法可以自定義;
最后數(shù)組方法的擴展
從字面認知:every是每一個都,some是都有一些就~~
即:
- every():方法用于檢測數(shù)組中所有元素是否都符合指定條件,若符合返回true,否則返回false;
- 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,如果對你有幫助,請點個贊吧;
更多內容請轉作者博客@王一諾的博客,多多交流~