JavaScript數(shù)組的一些奇葩行為
在程序語言中數(shù)組的重要性不言而喻,JavaScript中數(shù)組也是最常使用的對象之一,數(shù)組是值的有序集合,由于弱類型的原因,JavaScript中數(shù)組十分靈活、強(qiáng)大,不像是Java等強(qiáng)類型高級語言數(shù)組只能存放同一類型或其子類型元素,JavaScript在同一個(gè)數(shù)組中可以存放多種類型的元素,而且是長度也是可以動(dòng)態(tài)調(diào)整的,可以隨著數(shù)據(jù)增加或減少自動(dòng)對數(shù)組長度做更改。
今天,復(fù)習(xí)了一下JavaScript的數(shù)組,然后,把他的一些奇葩行為總結(jié)了一下,在這里和大家share一下,如果有不對的地方,歡迎指出!
奇葩1:Array()構(gòu)造器函數(shù)可以不使用new關(guān)鍵字進(jìn)行調(diào)用:
Array()構(gòu)造器使用傳遞給他的參數(shù)作為數(shù)組的元素,從而創(chuàng)建數(shù)組,一般的,我們是如下調(diào)用的:
var a = new Array(1, 2, "bom!"); a.length; //3 console.log(a); //[1, 2, "bom!"]
但是,省略掉new也是可以的,如下:
var a = Array(1, 2, "bom!"); a.length; //3 console.log(a); //[1, 2, "bom!"]
雖然,我不知道他的內(nèi)部實(shí)現(xiàn)機(jī)制是什么,但是,猜想他的構(gòu)造器函數(shù)可能是如下定義的:
function Array(args) {
//如果,this不是Array的實(shí)例的話,
//說明不是通過new調(diào)用的,則在這里再重新調(diào)用
if( !this instanceof Array) {
return new Array(args);
}//后面是正常調(diào)用時(shí)的實(shí)現(xiàn)代碼
//...
}
奇葩2:當(dāng)只傳一個(gè)參數(shù)給構(gòu)造函數(shù)時(shí),行為莫測
如果只傳一個(gè)參數(shù),并且這個(gè)參數(shù)是一個(gè)整數(shù),將會(huì)得到一個(gè)數(shù)組,并且length等于這個(gè)參數(shù)
var a = new Array(12); console.log(a.length); //12 console.log(a); //[]
如果只傳一個(gè)浮點(diǎn)數(shù),就會(huì)報(bào)錯(cuò):
var a = new Array(1.1); //Uncaught RangeError: Invalid array length(…)
傳遞一個(gè)字符串就會(huì)正常工作,并且該字符串作為數(shù)組的第一個(gè)元素:
var a = new Array("1.1");
console.log(a.length); //
console.log(a); //["1.1"]
但是為了避免二義性,我建議最好是是直接使用字面量的形式創(chuàng)建數(shù)組:
var a = []; //空數(shù)組 var a = [1, 1, "bom"]; //三個(gè)元素 var a = [12]; //一個(gè)元素,并且元素是12
奇葩3:數(shù)組的length屬性可以被修改(可寫)
如下,我們直接把本來是2的length改成了100,而且還修改成功了?。。?br />
var a = [1, 2, 3, 4]; console.log(a.length); //4 a.length = 100; console.log(a.length); //100
雖然length等于100,但是,元素a[4]-a[99]是不存在的,并且如果你請求他們的值的話,例如,從0到a.length做一個(gè)循環(huán)中做的話,那么會(huì)得到undefined。
接下來再看:
var a = [1, 2, 3, 4]; a.length = 100; console.log(a[10]); //undefined console.log(99 in a); //false
與下面的例子有點(diǎn)相似:
var a = [1, 2, 3, 4]; a[99] = undefined; console.log(a.length); //100
不同之處在于,這里的a[99]存在了,因?yàn)槲覀儎?chuàng)建了它,即使他擁有的是undefined的值。但是從a[4]到a[98]的所有元素則是不存在的,如下:
var a = [1, 2, 3, 4]; a[99] = undefined; console.log(99 in a); //true; console.log(98 in a); //false console.log(a.length); //100
以上所述給大家分享了JavaScript數(shù)組的一些奇葩行為,文章寫的不好還請見諒,謝謝!
相關(guān)文章
OpenLayers3實(shí)現(xiàn)地圖鷹眼以及地圖比例尺的添加
這篇文章主要為大家詳細(xì)介紹了OpenLayers3實(shí)現(xiàn)地圖鷹眼以及地圖比例尺的添加,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09
微信小程序當(dāng)前時(shí)間時(shí)段選擇器插件使用方法詳解
這篇文章主要為大家詳細(xì)介紹了微信小程序當(dāng)前時(shí)間時(shí)段選擇器插件使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
layer.open 子頁面彈出層向父頁面?zhèn)鬏敂?shù)據(jù)的例子
今天小編就為大家分享一篇layer.open 子頁面彈出層向父頁面?zhèn)鬏敂?shù)據(jù)的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
xmlplus組件設(shè)計(jì)系列之樹(Tree)(9)
xmlplus 是一個(gè)JavaScript框架,用于快速開發(fā)前后端項(xiàng)目。這篇文章主要介紹了xmlplus組件設(shè)計(jì)系列之tree,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
在SSM框架下用laypage和ajax實(shí)現(xiàn)分頁和數(shù)據(jù)交互的方法
今天小編大家分享一篇在SSM框架下用laypage和ajax實(shí)現(xiàn)分頁和數(shù)據(jù)交互的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
JS遍歷數(shù)組及打印數(shù)組實(shí)例分析
這篇文章主要介紹了JS遍歷數(shù)組及打印數(shù)組的方法,結(jié)合實(shí)例形式分析JavaScript數(shù)組的遍歷與打印輸出相關(guān)技巧,需要的朋友可以參考下2016-01-01
解決webpack dev-server不能匹配post請求的問題
這篇文章主要介紹了解決webpack不能匹配post請求的問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
SyntaxHighlighter自動(dòng)識別并加載腳本語言
SyntaxHighlighter是一個(gè)使用JavaScript編寫的支持多種編程語言語法高亮的JS插件,很多大型網(wǎng)站或博客都在使用?,F(xiàn)在給大家介紹一下如何讓它自動(dòng)識別加載我們添加的代碼語言2017-02-02

