JavaScript基礎(5)—— 數組

  我們都知道typeof(Array)的計算值是object,在JavaScript中,數組一般是一組連續的索引和值,而對象往往是一組不確定的屬性和值,他們的本質區別在於屬性值是否連續(注意:數組元素也可以是不連續的,如稀疏數組)。在編程中,一組擁有連續索引值的對象有許多好處:首先在使用數組的時候用戶無需關心屬性名,因爲索引值是連續自增的整數。其次,用戶在訪問數組的時候可以輕鬆實現遍歷,這一點for循環就可以做到。而對於JavaScript引擎而言,數組對象在創建的時候會被分配一組連續的可擴展的內存,由於內存分配的連續性,數組能更快的完成索引,也就是說,數組往往比對象擁有更好的訪問性能。

  綜上所述,數組是對象的一種特殊形式。那麼爲什麼數組的概念,需要單獨拎出來吶?個人認爲:在任何編程語言中,數組都是不可或缺的數據類型之一,JavaScript也不例外,當我們使用數組直接量創建數組對象的時候,會從Array.prototype中繼承很多有用的數組操作方法,這些操作方法讓數組真正的和對象區別開來。

1.創建數組

  創建數組的方法主要有兩種,一種是數組直接量,另外一種就是調用構造函數創建數組,如下

let arr = [] //創建一個空數組
let arr2 = new Array(10) //第一個參數指定創建數組的長度,但是數組中沒有存儲值

  需要注意的是,arr2只是一個指定長度的數組(arr.length :10),該數組中沒有存儲任何值,甚至數組的索引值都沒有定義。

2.數組的讀寫

  數組的讀寫方式和對象的相同。需要注意的是以下幾種特殊情況:

  1.你不能通過點(.)運算符訪問數組元素,因爲整數值不能作爲點運算符的計算值,因此我們需要通過方括號([])訪問數組元素。

  2.數組的索引值一般從0開始,但並不是絕對的,a[-1] = 1會創建一個名爲-1的屬性值,儘量不要這樣做。

  3.數組作爲對象,可以從原型中繼承元素,數組可以定義元素的getter和setter方法。

3.稀疏數組

  稀疏數組就是數組的length屬性大於元素的個數。可以直接通過構造函數來創建一個稀疏數組。

let arr = new Array(5) //創建一個length值爲5,數組元素爲0的元素

 除了構造函數,對象直接量也可以完成稀疏數組的創建。

let a = []
a[1000] = 0 //length爲1001,但是隻有一個元素

 上面這兩種方法比較常規,除此之外,你還可以用delete操作符來產生稀疏數組。這裏不過多介紹。在創建稀疏數組的時候需要注意以下兩種情況。

let arr1 = [,,,] // [undefined,undefined,undefined]
let arr2 = new Array(3) // 該數組沒有任何元素
0 in arr1 //true
0 in arr2 //false

4.數組的長度

  每個數組都有一個length屬性,就是這個屬性區別於常規的JavaScript對象。數組的length屬性是支持手動設置的。

  如果你設置數組的length屬性值大於其當前的長度,那麼它會在尾部創建一個空的區域。

  如果你設置數組的length屬性值小於其當前的長度,那麼他會把那些索引值大於或等於n的元素從數組中刪除。可以理解爲,length就是數組的最大索引值,如果數組元素的索引值大於length值,那他將不能被索引到,也就是“被刪除了”。

  由於修改數組的length值會產生一些意想不到的情況,因此我們可以利用Object.defineProperty()讓數組的length變成只讀屬性。

let arr = [1,2]
Object.defineProperty(arr,'length',{writable:false})

5.數組的常用方法

  在文章的開頭,我就提到了,數組和對象最大的區別就是,數組繼承自Array.prototype,而對象繼承自Object.prototype,數組從Array對象中繼承了許多操作函數,下面我們先來羅列一下一些常用的函數,你可以在後面找到每種函數的具體用法和參數解釋。

<-- 數組元素的添加 -->
arr.push(val)   //在數組的尾部添加一個值,返回該元素,並修改數組本身
arr.unshift(val)  //在數組的頭部添加一個值,返回該元素,並修改數組本身
arr.splice(1,0,2) //第一個參數指定了插入(刪除)元素的起始位置,第二個參數指定了個數
//第二個之後的參數數量爲任意個,指定了需要插入到數組中的元素

<-- 數組元素的刪除 -->
arr.pop() //刪除數組的最後一個元素,返回該元素,並修改數組本身
arr.shift() //刪除數組頭部的元素,返回該元素,並修改數組本身
arr.splice(1,2) //表示刪除元素的從第‘1’個開始,到第‘2’個結束,也就是刪除了第二個和第三個元素
arr.slice(2,3) //兩個參數指截取數組開始和結束的字段,
//如果第二個值是負整數,則代表倒數第幾個元素,如果第二個值缺省,則代表到最後一個元素
//該方法返回截取的片段,並且不會修改調用的數組

<-- 數組元素的排序 -->
arr.sort((a,b)=>{return (a-b)}) //默認按字母表順序排,a-b從小到大排,b-a從大到小

<-- 數組元素的遍歷 -->
arr.forEach((item)=>{}) //該方法會自動過濾掉空值
arr.map((item)=>{return item+1}) //該方法會返回一個新的數組,並不會修改原數組
arr.fiter((item)=>{return item!==1})//該方法會返回一個索引值符合回調函數判斷的新數組

<-- 數組元素的邏輯判定 --> 
arr.every((item)=>{return item===1})//判定數組中的每個元素是否符合回調函數裏的判斷,返回一個布爾值,遇到false就終止循環
arr.some((item)=>{return item===1})//判定數組中是否有元素符合回調函數裏的判斷,返回一個布爾值,遇到true就終止循環

<-- 連接兩個數組 -->
arr.concat([1,2,3]) //該方法返回一個新數組,對原數組沒有影響,所以需要一個新的數組接收值

<-- 數組轉字符串 -->
arr.join('/') //括號內指定元素之間的分隔符,默認是逗號,該方法是String.split()的逆向操作

<-- 數組元素倒序 -->
arr.reverse() //該方法把數組中的元素顛倒,如果面試考這個,可以直接寫

<-- 數組元素的組合 -->
arr.reduce((total,current)=>{
    return total+current
},0)
//reduce本意是縮小,減少,卻經常被拿來做加法運算,後面我會詳細介紹這個方法

<-- 數組元素的查詢 -->
arr.find((item)=>{return item===1}) //查找到第一個符合條件的值,並返回該值
arr.indexOf((item)=>{return item===1}) //查找到第一個符合條件的值,並返回索引值

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章