JavaScript中的數(shù)組特性介紹
與Java語言不同,JavaScript中的數(shù)組擁有三個(gè)特性:
1.無類型。數(shù)組的成員可以是任何類型,同一個(gè)數(shù)組也可以由很多不同類型的成員所組成。
2.長度可變。數(shù)組的長度是可以動(dòng)態(tài)變化的,因此在JavaScript中不存在數(shù)組訪問的越界問題。
3.不連續(xù)性。數(shù)組中成員的位置可以是連續(xù)的(0, 1, 2, 3…),也可以是不連續(xù)的。任何數(shù)組都有一個(gè)名為length的屬性,在數(shù)組成員連續(xù)的情況下,length值與數(shù)組成員數(shù)目一致;當(dāng)數(shù)組成員不連續(xù)時(shí),length值要大于數(shù)組成員的數(shù)目。與連續(xù)的數(shù)組相比,不連續(xù)數(shù)組的讀寫性能要差一些。
實(shí)驗(yàn):
var o = [42, "Sample Text", {x:88}];//JavaScript array is un-typed.
console.log(o);//[42, "Sample Text", Object {x=88}]
o[3] = 27;//JavaScript array is dynamic.
console.log(o);//[42, "Sample Text", Object {x=88}, 27]
o[5] = 99;//JavaScript array is sparse.
console.log(o);//[42, "Sample Text", Object {x=88}, 27, undefined, 99]
從上面的例子中可以看到,對于不連續(xù)的數(shù)組,當(dāng)訪問到缺失的那個(gè)成員時(shí),JavaScript將返回undefined。如果數(shù)組連續(xù),但是其中某個(gè)成員為undefined,那么訪問數(shù)組的結(jié)果是一樣的:
var a = [42, "Sample Text", {x:88}, 27, undefined, 99];
console.log(a);//[42, "Sample Text", Object {x=88}, 27, undefined, 99]
數(shù)組不連續(xù)、有成員缺失,跟數(shù)組連續(xù)、但有成員為undefined,這兩種情況下訪問數(shù)組內(nèi)容所得到的結(jié)果是一樣的。但在這兩者之間還是存在一些細(xì)微的差別,主要表現(xiàn)在對數(shù)組key的訪問上:
console.log(4 in o);//false
console.log(4 in a);//true
可以看到,這兩種情況下雖然訪問內(nèi)容所得到的結(jié)果一致,但是其內(nèi)部機(jī)制是完全不同的:在數(shù)組不連續(xù)的情況下,某個(gè)成員缺失,因此當(dāng)訪問該成員時(shí),JavaScript返回了undefined;在數(shù)組連續(xù)的情況下,所有的成員都存在,只是某些成員的值比較特殊,為undefined而已。
從上面的例子中也可以看到,JavaScript中的數(shù)組究其本質(zhì)只是以數(shù)字為key的對象而已,與普通的鍵值對對象沒有任何差別。事實(shí)上,在對數(shù)組進(jìn)行讀取和寫入操作時(shí),JavaScript會(huì)試圖將參數(shù)轉(zhuǎn)換為正整數(shù),如果轉(zhuǎn)換成功則將進(jìn)行數(shù)組操作(自動(dòng)更新數(shù)組的length屬性),如果失敗則將參數(shù)轉(zhuǎn)換成字符串后進(jìn)行普通對象的讀寫操作。當(dāng)然,在JavaScrpt解釋器的實(shí)現(xiàn)中,針對數(shù)組的這種以數(shù)字作為key的特性作了很多性能優(yōu)化,因此在實(shí)際使用過程中,如果對象的key都是數(shù)字,那么直接使用數(shù)組對象會(huì)得到更加高效的結(jié)果。
在對數(shù)組進(jìn)行定義的過程中,JavaScript允許出現(xiàn)多余的逗號(hào),也允許兩個(gè)逗號(hào)間出現(xiàn)數(shù)組成員的缺失:
var x = [1,2,3,];//trailing comma will be omitted.
console.log(x.length);//3
var y = [1,,3];//member can be missed.
console.log(y);//[1, undefined, 3]
console.log(1 in y);//false
console.log(y.length);//3
對于數(shù)組的創(chuàng)建,JavaScript支持四種方法:
1.使用字面量(如上述幾個(gè)例子中的中括號(hào)表達(dá)式)來直接創(chuàng)建數(shù)組對象。
2.使用Array()構(gòu)造函數(shù),不傳入任何參數(shù)。在這種情況下,將創(chuàng)建一個(gè)空數(shù)組,其效果與[]等同。
3.使用Array()構(gòu)造函數(shù),傳入一個(gè)正整數(shù)作為數(shù)組的長度。在這種情況下,JavaScript將預(yù)留相應(yīng)的內(nèi)存空間來存儲(chǔ)這個(gè)數(shù)組。值得注意的是,此時(shí)數(shù)組的key都是沒有被定義的,也即數(shù)組中沒有任何成員。其效果與[,,,,]這樣的寫法等同
4.使用Array()構(gòu)造函數(shù),傳入數(shù)組的成員。
實(shí)驗(yàn):
var z = new Array(10);//pre-allocate memory, but no index is defined yet.
console.log(3 in z);//false
var m = new Array(42, 33, 99, "test", {k:99});
console.log(m);//[42, 33, 99, "test", Object {k=99}]
在ECMAScript 5標(biāo)準(zhǔn)中,可以用Array.isArray()來判斷某個(gè)對象是否是數(shù)組:
Array.isArray([]);//true
Array.isArray({});//false
- JavaScript數(shù)組Array對象增加和刪除元素方法總結(jié)
- Javascript基礎(chǔ)教程之?dāng)?shù)組 array
- javascript數(shù)組輸出的兩種方式
- 深入探密Javascript數(shù)組方法
- 淺談javascript中字符串String與數(shù)組Array
- Javascript中數(shù)組sort和reverse用法分析
- JavaScript中數(shù)組成員的添加、刪除介紹
- JavaScript中的數(shù)組操作介紹
- JavaScript中的類數(shù)組對象介紹
- javascript中數(shù)組的定義及使用實(shí)例
相關(guān)文章
JS生態(tài)系統(tǒng)加速模塊解析賦能性能優(yōu)化探索
這篇文章主要為大家介紹了JS生態(tài)系統(tǒng)加速模塊解析賦能性能優(yōu)化探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01使用JavaScript實(shí)現(xiàn)一個(gè)小程序之99乘法表
這篇文章主要介紹了使用JavaScript實(shí)現(xiàn)一個(gè)小程序之99乘法表的相關(guān)資料,需要的朋友可以參考下2017-09-09淺析JavaScript定時(shí)器setTimeout的時(shí)延問題
這篇文章主要為大家詳細(xì)介紹了JavaScript中定時(shí)器setTimeout有最小時(shí)延的相關(guān)知識(shí),文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11讓getElementsByName適應(yīng)IE和firefox的方法
讓getElementsByName適應(yīng)IE和firefox的方法...2007-09-09JavaScript中你不知道的Object.entries用法
大家應(yīng)該都知道,Object.entries()方法返回一個(gè)給定對象自身可枚舉屬性的鍵值對數(shù)組,其排列與使用 for...in 循環(huán)遍歷該對象時(shí)返回的順序一致,這篇文章主要給大家介紹了關(guān)于JavaScript中你不知道的Object.entries用法的相關(guān)資料,需要的朋友可以參考下2021-10-10