成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Javascript數(shù)組不完全解析

lscho / 2454人閱讀

摘要:關(guān)于數(shù)組的遍歷,的方式相對(duì)于等語言是很奇怪的打印結(jié)果可以看到,打印的結(jié)果不是數(shù)組的元素,而是數(shù)字索引值感覺這好像也可以說明,的數(shù)組也是用的方式存儲(chǔ)的,不管怎樣,這一點(diǎn)要注意。

上一篇說了數(shù)組的索引,這一篇說下數(shù)組的使用。

數(shù)組的大小

js的數(shù)組可以動(dòng)態(tài)調(diào)整大小,更確切點(diǎn)說,它沒有數(shù)組越界的概念,a[a.length]沒什么問題。比如聲明一個(gè)數(shù)組a = [1, 3, 5],現(xiàn)在的數(shù)組大小是3,最后一個(gè)元素的索引是2,但是你依然可以使用a[3],訪問a[3]返回的是undefined,給a[3]賦值:a[3] = 7,是給數(shù)組a添加了一個(gè)元素,現(xiàn)在數(shù)組a的長(zhǎng)度是4了。你可以試試把下面這段代碼放到瀏覽器里運(yùn)行下:

    var a = [];
    for(int i = 0; i <= a.length; i++)
    {
        a[a.length] = i;
    }

在我的電腦上,火狐會(huì)立馬崩掉,chrome這一個(gè)標(biāo)簽cpu占用99%(使用chrome的任務(wù)管理器查看的)。

js的length的值會(huì)隨著數(shù)組元素的改變而改變,當(dāng)然你也可以手動(dòng)設(shè)置數(shù)組的 length 屬性,設(shè)置更大的length不會(huì)給數(shù)組分配更多的空間,但是設(shè)置更小的length則會(huì)導(dǎo)致所有下標(biāo)大于等于新length的屬性被刪除。

另外有一點(diǎn)就是,數(shù)組的length值是怎么來的,有的資料說是最大一個(gè)數(shù)字索引值加一,應(yīng)該是對(duì)的,不過如果把空槽也算數(shù)的話,length值就是數(shù)組的元素?cái)?shù)。上張圖解釋下:

從圖里可以看到,有個(gè)數(shù)組a,a[0]a[10]都已賦值,這時(shí)候a的length是11,中間有9個(gè)empty slot(姑且就翻譯為空槽好了)。那這九個(gè)空槽算不算數(shù)呢,我覺得應(yīng)該算,這樣就能合理的解釋length值了。那這些空槽的值是什么呢?undefined!所以呢,如果在chrome里,使用foreach遍歷(forin),那么這些空槽正好都能跳過,而使用for遍歷,則會(huì)打印出undefined。至于在firefox里,表現(xiàn)不太一樣,自己試吧。

數(shù)組的遍歷

昨天在看微博上轉(zhuǎn)的js教程的時(shí)候,里面說在遍歷數(shù)組的時(shí)候,判斷語句i會(huì)造成每循環(huán)一次都要計(jì)算一次長(zhǎng)度,從而對(duì)性能有一點(diǎn)點(diǎn)影響。這一點(diǎn)我表示疑問,我不確定到底是不是這樣,而且不同的瀏覽器對(duì)這種情況可能還有不同的優(yōu)化,我在網(wǎng)上搜了下,找到了幾個(gè)網(wǎng)頁說了要緩存數(shù)組大小,但是都是抄的,沒主見,也沒說明原理,所以我表示很懷疑,而且我在chrome測(cè)試了下,性能上沒什么明顯差異。關(guān)鍵是我覺得,length是個(gè)數(shù)組的屬性,每次調(diào)用a.length的時(shí)候,只是訪問這個(gè)屬性而已,屬性都是用hash的方式存儲(chǔ)的,所以訪問的時(shí)間復(fù)雜度是O(1)。這是我的看法,如果不對(duì),請(qǐng)告訴我。

關(guān)于數(shù)組的foreach遍歷,js的方式相對(duì)于java/c#等語言是很奇怪的:

        for(var name in ["huey", "dewey", "louie"]) {
            console.log(name);
        }
        /*
            打印結(jié)果:
            0
            1
            2
        */

可以看到,打印的結(jié)果不是數(shù)組的元素,而是數(shù)字索引值(感覺這好像也可以說明,js的數(shù)組也是用hash的方式存儲(chǔ)的),不管怎樣,這一點(diǎn)要注意。(至于為什么這樣,我覺得數(shù)組元素都是數(shù)組的屬性,這個(gè)遍歷是遍歷的length值,從0到length。而不是逐個(gè)輸出數(shù)組的元素,因?yàn)樵厥菍傩?,?shù)組又不只數(shù)字索引這一種屬性,那么為什么這樣遍歷的時(shí)候只輸出它們呢,而不是length,push,join等方法?公平起見,只好輸出數(shù)組的數(shù)字索引了。當(dāng)然,這只是我自己的看法,具體怎么樣我沒研究。)

數(shù)組的一些方法

數(shù)組有pushpop方法,這樣數(shù)組就像堆棧一樣了。對(duì)數(shù)組使用delete,可以將數(shù)組中某個(gè)元素移除,但是那樣會(huì)在數(shù)組中留下一個(gè)空洞(也就是說delete也可以刪除數(shù)組中的元素,但是只是刪除該位置的值,不改變數(shù)組大小,原位置類型是undefined),這是因?yàn)榕旁诒粍h除元素之后的元素保留著它們最初的屬性,所以應(yīng)該使用splice對(duì)進(jìn)行過delete操作的數(shù)組進(jìn)行瘦身,它會(huì)將被刪除的屬性移除,但這樣效率并不是很高。數(shù)組中還有map、reducefilter等方法,這里就不多說了(跟python中的list挺像的)。

補(bǔ)充

最后補(bǔ)充一點(diǎn),我前面說過,js中的數(shù)組就是對(duì)象(廢話,本來就是對(duì)象),那么是不是說,數(shù)組和對(duì)象可以互相互替換著用呢?答案是可以的。不過為了明確,還是分開用比較好,下面說下什么時(shí)候該用數(shù)組,什么時(shí)候該用對(duì)象(參考《javascript語言精粹》):

  

當(dāng)屬性名是小而連續(xù)的整數(shù)時(shí),應(yīng)該使用數(shù)組,否則,使用對(duì)象。
另外由于js中對(duì)數(shù)組和對(duì)象使用 typeof 的結(jié)果都是 Object,因此判斷一個(gè)對(duì)象是否為數(shù)組的方法:

    var is_array = function(value) {
    return Object.prototype.toString.apply(value) === "[object Array]";
    };
番外

覺得閉包被神化了,可能語言層面上的實(shí)現(xiàn)有技術(shù),但是在應(yīng)用層面我覺得就應(yīng)該那樣啊,使用的時(shí)候都感覺不到那是在用閉包。但是這個(gè)閉包卻幾乎成了面試前端必問的概念了。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85755.html

相關(guān)文章

  • Javascript數(shù)組索引完全解析

    摘要:數(shù)組的大小是不固定的,可以像這樣隨意添加。再看一張圖,這次多添加幾個(gè)元素,再給數(shù)組添加一個(gè)屬性注意看右側(cè)對(duì)象的元素索引不知道你有沒有發(fā)現(xiàn)。數(shù)組范圍和索引轉(zhuǎn)換那里是參考的,其他地方都是自己的理解和看法。 從題目說起,之所以是不完全,是因?yàn)橛行〇|西比如數(shù)組的方法怎么用這個(gè)我都不打算講,因?yàn)槟莻€(gè)看一下都會(huì),下面講的都是我覺得重要的,只關(guān)于數(shù)組對(duì)象本身。另外,由于我的Javascript實(shí)戰(zhàn)經(jīng)...

    levius 評(píng)論0 收藏0
  • 【譯】使用"BinaryAST"加快JavaScript腳本的解析速度?

    摘要:是提出并積極開發(fā)的一種新的在線格式,旨在加快解析速度,同時(shí)保持原始的語義不變。它的實(shí)現(xiàn)方式是使用有效的二進(jìn)制來表示代碼和數(shù)據(jù)結(jié)構(gòu),并且存儲(chǔ)和提供額外的信息來提前指導(dǎo)解析器工作。提升依賴于提升所有聲明變量函數(shù)類。 原文:Faster script loading with BinaryAST?本文首發(fā)于公眾號(hào):符合預(yù)期的CoyPan JavaScirpt的冷啟動(dòng) web應(yīng)用的表現(xiàn),越來...

    Hujiawei 評(píng)論0 收藏0
  • JSON數(shù)據(jù)格式的使用

    摘要:數(shù)據(jù)格式是一種輕量級(jí)的數(shù)據(jù)交換格式。為了對(duì)名為的對(duì)象進(jìn)行轉(zhuǎn)換,只需執(zhí)行相同形式的命令這就是與本系列討論的其他數(shù)據(jù)格式之間最大的差異。不過,我們讀起來費(fèi)解的語言,恰恰是適合機(jī)器閱讀,所以通過的索引就能夠讀取黑龍江這個(gè)值。 JSON 數(shù)據(jù)格式 JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。JSON采用完全獨(dú)立于語言的文本格式,這些特性使...

    番茄西紅柿 評(píng)論0 收藏0
  • 哎喲,這就是JSON

    摘要:官方的說法,也不是特別的明了,只說明了這是一種輕量級(jí)的數(shù)據(jù)交換格式,且基于一個(gè)子集。的語法介紹常見數(shù)據(jù)結(jié)構(gòu)有兩種形式,其分別是名稱值對(duì)的集合,類似中的對(duì)象。比如,則在中是行不通的。 寫這篇文章的緣由 你了解JSON嘛?JSON是JavaScript中對(duì)象嘛?JSON可以存儲(chǔ)function對(duì)象嘛?JSON的本質(zhì)是什么呢?JSON能寫注釋嘛? 如果你都能答上來,那恭喜你,你對(duì)JSON了...

    邱勇 評(píng)論0 收藏0
  • 完爆F(xiàn)acebook/GraphQL,APIJSON全方位對(duì)比解析(三)-表關(guān)聯(lián)查詢

    摘要:相關(guān)閱讀完爆,全方位對(duì)比解析一基礎(chǔ)功能完爆,全方位對(duì)比解析二權(quán)限控制自發(fā)布以來,不斷有網(wǎng)友拿來和的對(duì)比,甚至有不少人聲稱完爆。近年穩(wěn)步上升,已躍居第名。 相關(guān)閱讀: 完爆F(xiàn)acebook/GraphQL,APIJSON全方位對(duì)比解析(一)-基礎(chǔ)功能 完爆F(xiàn)acebook/GraphQL,APIJSON全方位對(duì)比解析(二)-權(quán)限控制 自APIJSON發(fā)布以來,不斷有網(wǎng)友拿來和Facebo...

    Jioby 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<