在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ ES6擴展運算符-數(shù)組擴展運算符

ES6擴展運算符-數(shù)組擴展運算符

圖片描述

當我運行以上代碼后,為什么輸出結(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"}?
很困惑啊~~

回答
編輯回答
不二心

clipboard.png
看上圖就應該能夠明白了。擴展運算符只是展開,但是其最后的數(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)方式。

clipboard.png

然后這里的輸出內(nèi)容并不符合類數(shù)組對象的定義,因為其缺少length屬性,也就不能進行迭代,需要滿足:其key值為從0開始的順序數(shù)字,有l(wèi)ength屬性兩個條件。

2018年3月24日 00:11
編輯回答
焚音

把{...arr}換成[...arr]

2018年3月9日 19:45
編輯回答
薄荷糖

數(shù)組也是對象,你可以把下標看成key,{...arr}這個是展開arr成object格式,object格式必須有key、value組成,此時arr的下標就充當了key。
請問樓主你見過{"a","b","c"}這樣的數(shù)據(jù)類型嗎。。。

2017年6月29日 16:21
編輯回答
汐顏

沒毛病啊。
你的o接了個對象:{...arr}
你接個數(shù)組:[...arr]

2018年9月4日 00:14
編輯回答
葬愛

看過問題和其他人的答案后...其實你問題本身就是有問題的,所以一開始就從一個偏離的方向挖掘答案,自然無論怎樣都無法自圓其說,給你自己一個令人信服的答案。

這里的...并不是數(shù)組擴展運算符,而是ES6的提案、ES7標準中的對象擴展運算符(spread)。js解釋器從左至右解析,當看到{后邊跟的是...時,它會把這個...解釋為spread中的對象擴展運算符([后邊跟的...才是數(shù)組擴展運算符),那么此時將arr當做一個標準對象(類數(shù)組對象)來遍歷展開,這樣才出現(xiàn)了你看到的結(jié)果{a:"zhangsan",b:"lisi",c:"wangwu"}。

為了你能夠更好的理解我所說的答案,送你一段我整理過的關(guān)于rest與spread運算符的比較筆記:

spread與rest運算符:

  1. 等號表達式是典型的賦值形式,函數(shù)傳參和for循環(huán)的變量都是特殊形式的賦值。解構(gòu)的原理是賦值的兩邊具有相同的結(jié)構(gòu),就可以正確取出數(shù)組或?qū)ο罄锩娴脑鼗驅(qū)傩灾?,省略了使用下標逐個賦值的麻煩。
  2. 對于三個點號,三點放在形參或者等號左邊為rest運算符; 放在實參或者等號右邊為spread運算符,或者說,放在被賦值一方為rest運算符,放在賦值一方為擴展運算符。
  3. 經(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對象的使用。
    
  4. ES7中對象的spread與rest

2017年9月8日 09:03
編輯回答
溫衫

這個{"a","b","c"}是什么格式,既不是json對象,也不是數(shù)組,當然不對
你要是let o = [...arr]還是會輸出["a","b","c"]

2017年4月27日 15:50