當我運行以上代碼后,為什么輸出結(jié)果是{0:"a",1:"b",2:"c"}而不是{"a","b","c"}呢?
按道理,數(shù)組的擴展運算符不是把數(shù)組擴展成一系列以逗號分隔的元素嗎?那為什么在o對象里擴展arr數(shù)組沒有把arr擴展成以逗號分割的"a","b",c而是擴展成了{0:"a",1:"b",2:"c"}呢?
查了半天文檔沒找到答案,求大佬解答
下面有人回答說{"a","b","c"}什么格式都不是,然后我就改了下,下面修改后的貼圖:
按道理,擴展后的結(jié)果不應該是{a,b,c}進而轉(zhuǎn)化成{a:"zhangsan",b:"lisi",c:"wangwu"}嗎?
為什么結(jié)果還是類數(shù)組對象{0: "zhangsan", 1: "lisi", 2: "wangwu"}?
很困惑啊~~
看上圖就應該能夠明白了。擴展運算符只是展開,但是其最后的數(shù)據(jù)結(jié)構(gòu)還是需要看外層包裹的是數(shù)組還是對象,如果是對象形式則是以數(shù)字為key的方式。
補充:
lz下面的提問,是因為擴展運算符進行計算時,獲取到的arr對象就已經(jīng)是["zhangsan","lisi","wangwu"]這樣的。
擴展運算符其本身原理是對原有的數(shù)據(jù)結(jié)構(gòu)進行迭代,并且將返回值以數(shù)組方式展開,那么將一個數(shù)組的結(jié)構(gòu)用對象呈現(xiàn)出來的結(jié)果是什么呢。
這里還有一個需要理解的就是js中的數(shù)組其實也就是對象,只不過是一種具有自己獨立屬性和方法的特殊對象,其特點比如說:1.有自己的數(shù)組方法;2.其key值為從0開始的順序數(shù)字;3.有l(wèi)ength屬性。
如果能夠理解上一條,那么返回去看輸出結(jié)果就明白了,其實上下的數(shù)據(jù)是一致的,只不過是在不同的對象類型下的不同呈現(xiàn)方式。
然后這里的輸出內(nèi)容并不符合類數(shù)組對象的定義,因為其缺少length屬性,也就不能進行迭代,需要滿足:其key值為從0開始的順序數(shù)字,有l(wèi)ength屬性兩個條件。
看過問題和其他人的答案后...其實你問題本身就是有問題的,所以一開始就從一個偏離的方向挖掘答案,自然無論怎樣都無法自圓其說,給你自己一個令人信服的答案。
這里的...并不是數(shù)組擴展運算符,而是ES6的提案、ES7標準中的對象擴展運算符(spread)。js解釋器從左至右解析,當看到{后邊跟的是...時,它會把這個...解釋為spread中的對象擴展運算符([后邊跟的...才是數(shù)組擴展運算符),那么此時將arr當做一個標準對象(類數(shù)組對象)來遍歷展開,這樣才出現(xiàn)了你看到的結(jié)果{a:"zhangsan",b:"lisi",c:"wangwu"}。
為了你能夠更好的理解我所說的答案,送你一段我整理過的關(guān)于rest與spread運算符的比較筆記:
spread與rest運算符:
經(jīng)驗:
? 在等號賦值或for循環(huán)中,如果需要從數(shù)組或?qū)ο笾腥≈?,盡量使用解構(gòu)。
? 在自己定義函數(shù)的時候,如果調(diào)用者傳來的是數(shù)組或?qū)ο螅螀⒈M量使用解構(gòu)方式,優(yōu)先使用對象解構(gòu),其次是數(shù)組解構(gòu)。代碼可讀性會很好。
? 在調(diào)用第三方函數(shù)的時候,如果該函數(shù)接受多個參數(shù),并且你要傳入的實參為數(shù)組,則使用擴展運算符??梢员苊馐褂孟聵诵问絺魅?yún)?shù)。也可以避免很多人習慣的使用apply方法傳入數(shù)組。
? rest運算符使用場景應該稍少一些,主要是處理不定數(shù)量參數(shù),可以避免arguments對象的使用。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。