js之數組,對象,類數組對象


許久不寫了,實在是不知道寫點什么,正好最近有個同事問了個問題,關於數組,對象和類數組的,仔細說起來都是基礎,其實都沒什么好講的,不過看到還是有很多朋友有些迷糊,這里就簡單對於定義以及一下相同點,不同點簡單的說明一下!當然,這里我們只討論數據結構的異同,並不討論他們之間所擁有的方法等不同!

 

數組定義:簡而言之就是一組有序的數據集合,其索引為從0開始且自然增長的整數,其元素值可以是任何js數據!並且包含一個名為length的屬性,該屬性表示數組元素的個數!

看着上面的定義,我們很容易就能大概知道數組是什么樣的東西,下面我們來看個簡單的例子:

var array = [1,2,3];
console.log(array[0])//1
​console.log(array[1])//2
​console.log(array[2])//3
​console.log(array['length'])//3

  

 
         

從上面的例子我們可以看到,在聲明數組時,我們只是顯式的聲明了數組元素的值,並沒有顯式的給這些值定義索引和length屬性,但是在數組定義好后我們發現就可以直接使用數組的索引值來操作數組的元素了,從這不難看出,數組元素的索引和length屬性是在數組定義時根據數組元素語言自動就幫你定義好了!而且很容易就能看出來,索引值是從0開始並且自然遞增的!

 

對象定義:js中對象類型為一組無序的由鍵->值組成的數據集合,其元素的鍵名和值都可以自定義!

我們來看一個例子:

var object = {'a': 1, 'b': 2}
console.log(object['a'])//1
console.log(object['b'])//2
console.log(object['length'])//undefined

  

從上面的例子簡單來看,對象自身所擁有的(不包括繼承來的)任何屬性都是有用戶自定義的!

 

數組與對象:

從上面的定義和例子上來看,不知道大家有沒有發現,數組和對象在某些地方或時候其實是很相像的!

我們先看看他們相同的部分,首先我們可以把數組的索引值看成的元素的鍵名,元素看成是值,那么數組是不是也變成了鍵->值構成的了!

我們在來看看他們不一樣的地方,數組的所以值始終的從0開始遞增的數字,對象的屬性值可以是任何自定義的字符串,並且數組包含一個length屬性,而對象自身所擁有的(不包括繼承來的)任何屬性都是有用戶自定義的!也就是說我們,我們可以給顯式的給對象定義length屬性!

var arr = [1,2,3];
var obj = {0: 1, 1: 2, 2: 3, length: 3};
console.log(arr[0], obj[0])//1, 1
console.log(arr['length'], obj['length'])//1, 1

  

 
         

通過對比,我們發現完全可以使用對象來模擬數組,只要我們定義的對象的每個元素的鍵名都使用數字並且讓其保持遞增,且動態的定義一個length屬性來表示元素個數,那么從效果上來說,基本就個數組相同了!這就是我們要說的:

類數組對象:只包含使用從零開始,且自然遞增的整數做鍵名,並且定義了length表示元素個數的對象,我們就認為他是類數組對象!

 

類數組對象不僅是效果上跟數組相似,並且在某些操作上也相同:

//定義數組和類數組對象
var arr = [1,2,3];
var obj = {0: 1, 1: 2, 2: 3, length: 3};
//元素讀寫操作
console.log(arr[0], obj[0])//1, 1
console.log(arr['length'], obj['length'])//1, 1
arr[0] = 9;
obj[0] = 9;

//遍歷
for(var i = 0, len = arr.length; i < len; i++) {
    arr[i]....
}
for(var i = 0, len = obj.length; i < len; i++) {
    obj[i]....
}

  

 
         

我們看到,不僅在讀寫等操作上類數組對象和數組相似,並且在遍歷元素上都可以使用for循環進行遍歷!

 

 
通過上面我們對於定義的介紹,以及簡單的對比,我們不難看出,其實我們可以從數據結構上把js的數組歸為對象,因為我們可以使用對象來模擬數組,當然這里僅僅說的是數據結構上,其實他們本身所繼承來的方法和一些屬性是不同的!在平常的理解中大家可以把數組看成是特殊的對象,以方便理解! 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM