成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

為什么說(shuō)在 JS 中要避免使用 delete

sevi_stuo / 2563人閱讀

摘要:在中操作符用于刪除對(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è)置為 undefinedomit 三種方法該如何抉擇?

圖中顯示了,在不同的 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

相關(guān)文章

  • Java 實(shí)現(xiàn)與 Word 風(fēng)格相似的菜單

    摘要:因?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...

    JeOam 評(píng)論0 收藏0
  • Node.js 熱更新(一)

    摘要:直到最近在使用微信機(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ā) ...

    LancerComet 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<