有時我是真不敢用“解構(gòu)賦值”和“拓展運算符”??!
前言
大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎(chǔ)是進階的前提是我的初心~
解構(gòu)賦值
解構(gòu)賦值 我相信大家都不陌生,這是一個方便大家開發(fā)的語法,你可以使用 解構(gòu)賦值 從 數(shù)組、對象 中解構(gòu)出對應(yīng) 索引、屬性 所對應(yīng)的值,比如下方對于數(shù)組進行的解構(gòu),可以使用 [] 進行解構(gòu)。
圖片
但是你們真的知道為什么這種寫法能完成解構(gòu)的嗎?想要了解為什么,我們可以看看 V8 的源碼,可以看出,為了通過這種寫法能完成解構(gòu),v8 底層其實做了很多事情。
圖片
其實數(shù)組的解構(gòu),也可以使用 {} 進行解構(gòu)。
圖片
而相比于使用 [] 的解構(gòu),明顯 V8 在為使用 {} 做解構(gòu)時,做的工作就少了很多。
性能測試
為了證實上述的觀點,我準備了以下的代碼例子,可以看到 [] 耗時是 {} 的三倍以上。
圖片
建議
所以建議大家,在進行大數(shù)量的循環(huán)里,想要對數(shù)組進行解構(gòu)的話,最好是通過 {} 去解構(gòu),這樣減少一點性能損耗。
拓展運算符
拓展運算符 大家也不陌生,也是一個使用起來很方便的語法,主要用在 數(shù)組、對象 上,基本語法如下:
圖片
但是很多人不知道,如果你的數(shù)組數(shù)據(jù)量很大的時候,使用 拓展運算符 會直接崩掉!
圖片
圖片
通過 Babel 編譯后可知,push 方法最終會編譯成 apply
圖片
在查閱了MDN后終于知道了原因,如果按上面方式調(diào)用apply,有超出JavaScript引擎參數(shù)長度上限的風(fēng)險。一個方法傳入過多參數(shù)(比如一萬個)時的后果在不同JavaScript引擎中表現(xiàn)不同
圖片
建議
在數(shù)據(jù)可能量比較大的時候,不應(yīng)該使用拓展運算符,而是因為使用循環(huán)
圖片
或者使用 concat
圖片