摘要:在中操作符用于刪除對(duì)象的某個(gè)屬性。在運(yùn)行時(shí)會(huì)創(chuàng)建隱藏類(lèi),這些類(lèi)附加到每個(gè)對(duì)象上,以跟蹤其形狀布局。可以很明顯地得出一個(gè)結(jié)論,設(shè)置為。
在 JavaScript 中 delete 操作符用于刪除對(duì)象的某個(gè)屬性。例如
const person = { name: "sudada", gender: "female" } delete person.name console.log(person.name) // undefined
與最直觀的語(yǔ)義不同,使用 delete 操作符并不會(huì)直接釋放內(nèi)存,而是說(shuō)它會(huì)使得 V8(Javascript)引擎中的 hidden class 失效,將該 object 變?yōu)橐粋€(gè)通用的 slow object,這就使得執(zhí)行速度有了很明顯的降低。
hidden class:由于 JavaScript 是一種動(dòng)態(tài)編程語(yǔ)言,屬性可進(jìn)行動(dòng)態(tài)的添加和刪除,這意味著一個(gè)對(duì)象的屬性是可變的,大多數(shù)的 JavaScript 引擎(V8)為了跟蹤對(duì)象和變量的類(lèi)型引入了隱藏類(lèi)的概念。在運(yùn)行時(shí) V8 會(huì)創(chuàng)建隱藏類(lèi),這些類(lèi)附加到每個(gè)對(duì)象上,以跟蹤其形狀/布局。這樣可以?xún)?yōu)化屬性訪問(wèn)時(shí)間。參考:
http://debuggable.com/posts/u...:4c7e81e4-1330-4398-8bd2-761bcbdd56cb
https://stackoverflow.com/que...
那么如果不使用 delete ,我們?nèi)绾蝿h除對(duì)象的屬性?
最有效的方式,應(yīng)該是將不需要的屬性設(shè)置為 undefined ,例如
const person = { name: "sudada", gender: "female" } person.name = undefined // 刪除 name 屬性
或者你也可以考慮使用 Spread Operator for objects,例如
const person = { name: "sudada", gender: "female" } const omit = (prop, { [prop]: _, ...rest }) => rest; const newObj = omit("name", person); // 刪除 name 屬性
關(guān)于 Spread Operator for objects 的參考:https://juejin.im/post/5c35bd...
那么 delete、設(shè)置為 undefined 、omit 三種方法該如何抉擇?
圖中顯示了,在不同的 Javascript 內(nèi)核下,三種方法的效率(每秒執(zhí)行數(shù))??梢院苊黠@地得出一個(gè)結(jié)論,設(shè)置為 undefined > delete > omit。
實(shí)例地址:https://jsperf.com/removing-v...
但是設(shè)置為 undefined,得到的結(jié)果為
{ name: undefined, gender: "female" }
有時(shí)需要額外的操作,例如
JSON.parse(JSON.stringify(person)) // 或者 Object.keys(person).reduce((pre, cur) => { const value = person[cur] return value === undefined ? pre : {...pre, [cur]: value} }, {})
這樣效率會(huì)大幅度地降低,所以在實(shí)際業(yè)務(wù)中可以考慮使用 Map 來(lái)代替 object ,例如
let map = new Map([["a", 1]]) let obj = { a: 1 }; // 執(zhí)行 delete obj.a; map.delete("a");
從圖中,可以很明顯的得出 map.delete 優(yōu)于 delete。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106795.html
摘要:因?yàn)檫@意味著用戶(hù)實(shí)現(xiàn)功能的時(shí)間變少。人類(lèi)的失誤設(shè)計(jì)過(guò)程中要盡量避免用戶(hù)意外點(diǎn)中不相關(guān)的功能。常見(jiàn)的操作會(huì)用工具欄來(lái)實(shí)現(xiàn),它們被包裹在子菜單中。子菜單可以利用實(shí)現(xiàn),當(dāng)用戶(hù)點(diǎn)擊其他的子菜單時(shí)當(dāng)前顯示的子菜單應(yīng)從移除。 最后一次更新于 2019/07/09 菜單效果演示圖 Microsoft WordshowImg(https://segmentfault.com/img/bVbuSpm?w...
摘要:直到最近在使用微信機(jī)器人時(shí),遇到了強(qiáng)烈的需求。增刪文件后熱更新上面的代碼已經(jīng)不小心實(shí)現(xiàn)了增加文件后熱更新,因?yàn)楸硎緳z測(cè)的更新,如果增加一個(gè),那么就變成,于是新模塊不等于老模塊不存在,從而使用注冊(cè)事件監(jiān)聽(tīng)器。 背景 剛思考這個(gè)話(huà)題的時(shí)候,首先想到的是 Vue 或 React 的組件熱更新(基于 Webpack HMR),后來(lái)又想到了 Lua、Erlang 等語(yǔ)言的熱更新,不過(guò)在實(shí)際開(kāi)發(fā) ...
閱讀 975·2022-06-21 15:13
閱讀 1857·2021-10-20 13:48
閱讀 1044·2021-09-22 15:47
閱讀 1376·2019-08-30 15:55
閱讀 3132·2019-08-30 15:53
閱讀 528·2019-08-29 12:33
閱讀 724·2019-08-28 18:15
閱讀 3471·2019-08-26 13:58