原文
大綱
前言
對使用Array和[]創(chuàng)建數(shù)組的區(qū)別的解釋
個(gè)人理解
前言
JS定義數(shù)組變量時(shí)伺绽,在不需要給定數(shù)組的維度和長度的情況下滔灶,通常有兩種方法:
1牧牢、var arrTest=new Array();
2纸兔、var arrTest=[];
兩者效果一樣疮蹦。但是經(jīng)過查看與對比诸迟,在各種對外公開的JS大型開源類庫的代碼中,第一種方法基本看不到。
又或者你曾經(jīng)嘗試過下面這段代碼:
console.time('using[]')
for(var i=0; i<2000000; i++){var arr = []};
console.timeEnd('using[]')
console.time('using new')
for(var i=0; i<2000000; i++){var arr = new Array};
console.timeEnd('using new')
你會發(fā)現(xiàn)下面這段代碼的結(jié)果有一些有意思的規(guī)律阵苇,那就是:使用using new的時(shí)間總是會比using []來的長壁公。哦,yes,有可能你會覺得是因?yàn)榇a的順序的問題绅项,那么我們改一下代碼的順序贮尖,但是你會很遺憾的發(fā)現(xiàn),結(jié)果依然是使用using new的時(shí)間總是會比using []來的長趁怔,是不是感覺很神奇湿硝?下面就是本人對此問題收集到的一些解釋和自己對這個(gè)問題的理解。
對使用Array和[]創(chuàng)建數(shù)組的區(qū)別的解釋
針對這個(gè)問題進(jìn)行了搜索與尋找润努。在CSDN上找到一篇關(guān)于new Array()與[]的差別的討論帖关斜。帖子中提到了兩者的細(xì)微差別:使用new關(guān)鍵字的方法會在內(nèi)存中開辟一些空間,用來記錄與存儲該變量铺浇,也就是這是一個(gè)實(shí)例化過程痢畜。
以下為原帖中引用的記錄:
“new關(guān)鍵字的使用
除了在需要實(shí)例化一個(gè)對象,或罕見的需要延時(shí)加載數(shù)據(jù)的情況外鳍侣,你基本上不需要使用new關(guān)鍵字丁稀。在Javascript里分配大量的new變量地址是一項(xiàng)很慢的操作,為了效率起見倚聚,你應(yīng)該始終使用對象符號线衫。
在另外一個(gè)搜索結(jié)果中,有提到這樣的一個(gè)說法:
“很簡單惑折,Array()是一個(gè)對象授账,[]是一個(gè)數(shù)據(jù)原型。使用new Array()系統(tǒng)每次都會新生成一個(gè)對象(瀏覽器每生成一個(gè)對象都會耗費(fèi)資源去構(gòu)造他的屬性和方法)惨驶,他的子集是[]白热;
個(gè)人推薦使用[],效率高粗卜。瀏覽器對于CPU很吃緊屋确,所以很多時(shí)候要有技巧。比如數(shù)字轉(zhuǎn)換成字符只要a=a+'';就可以了续扔,比用String效率高了很多攻臀。但是如果亂用是會造成錯誤的
個(gè)人理解
我在數(shù)據(jù)類型一章中有提到過一種數(shù)據(jù)包裝類型,創(chuàng)建一個(gè)字符串的方式有:‘字符串’或者是new String('字符串')测砂,一種是直接創(chuàng)建了一個(gè)字符串茵烈,一個(gè)是調(diào)用字符串的構(gòu)造函數(shù)創(chuàng)建字符串對象然后再創(chuàng)建這個(gè)字符串百匆,中間多了一個(gè)創(chuàng)建對象的過程砌些,也許這在一般情況下是看不出什么區(qū)別的,但是像上述例子中,當(dāng)這個(gè)技術(shù)足夠大的時(shí)候存璃,就會發(fā)現(xiàn)了問題所在仑荐。因此,如果可以通過[]創(chuàng)建一個(gè)純凈的數(shù)組纵东,就不需要通過new Array()來創(chuàng)建數(shù)組粘招。
這便是我對創(chuàng)建數(shù)組的兩種方式的理解,如果有說的不對的地方希望讀者指正偎球,也希望能夠?qū)σ恍┳x者有所幫助洒扎。
參考網(wǎng)址
https://stackoverflow.com/questions/7375120/why-is-arr-faster-than-arr-new-array
https://tieba.baidu.com/p/2733656837?red_tag=2417487027
http://bbs.csdn.net/topics/390474239