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