亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript 對(duì)象不變性介紹

 更新時(shí)間:2022年02月09日 09:07:32   作者:CUGGZ?  
這篇文章主要介紹了JavaScript 對(duì)象不變性,對(duì)象不變性在任何編程語(yǔ)言中都是一個(gè)重要的概念。它會(huì)限制對(duì)象修改并防止不需要的更改。簡(jiǎn)而言之,對(duì)象的不變性就是將它的狀態(tài)變?yōu)橹蛔x的下面詳細(xì)內(nèi)容,需要的小伙伴可以參考一下

1. 基本概念

對(duì)象不變性在任何編程語(yǔ)言中都是一個(gè)重要的概念。它會(huì)限制對(duì)象修改并防止不需要的更改。簡(jiǎn)而言之,對(duì)象的不變性就是將它的狀態(tài)變?yōu)橹蛔x的,下面就來(lái)看看在 JavaScript 中的對(duì)象不變性。?

JavaScript中,一個(gè)對(duì)象可以有一個(gè)或多個(gè)屬性。每個(gè)屬性都是一個(gè)鍵值對(duì),

下面是一個(gè)對(duì)象:

const user = {
?? ?name: 'CUGGZ',
? age: 24,
}

這里使用const關(guān)鍵字定義了一個(gè)對(duì)象,它具有兩個(gè)屬性。默認(rèn)情況下,對(duì)象是可變的,也就是說(shuō),我們可以給對(duì)象添加新屬性,修改現(xiàn)有屬性或者刪除已有屬性。而在某些情況下,我們可能希望對(duì)象是不可變的,即不能添加新屬性,也不能修改和刪除已有屬性。

2. Object.freeze()

顧名思義,freeze() 就是用來(lái)凍結(jié)對(duì)象的。只需要將不想被更改的對(duì)象傳遞給它,就會(huì)返回該對(duì)象的不可變版本:

const user = {
?? ?name: 'CUGGZ',
? age: 24,
}

const freezeUser = Object.freeze(user);
freezeUser.age = 18;
console.log(freezeUser.age) // 24

這時(shí),新的對(duì)象就不可變了,相當(dāng)于被凍結(jié)了。?

JavaScript了,提供了一個(gè)Object.isFrozen(),它可以用來(lái)判斷一個(gè)對(duì)象是否被凍結(jié):

Object.isFrozen(user) ?// false
Object.isFrozen(freezeUser) ?// true

需要注意的是, Object.freeze() 方法不會(huì)影響嵌套對(duì)象,對(duì)于嵌套對(duì)象,凍結(jié)后仍然是可以操作的:

const user = {
?? ?name: 'CUGGZ',
? age: 24,
? article: {
? ?? ?title: 'learn javascript',
? ? number: 1234
? }
}

const freezeUser = Object.freeze(user);
freezeUser.age = 18
freezeUser.article.number = 666;
console.log(freezeUser.age) ? ? ? ? ? ? // 24
console.log(freezeUser.article.number); // 666

可以看到,使用Object.freeze() 方法凍結(jié)的對(duì)象,age是不可以更改的,但是嵌套對(duì)象的number屬性還是可以修改的。如果需要凍結(jié)嵌套對(duì)象使其不可變,就需要使用循遞歸來(lái)逐級(jí)凍結(jié),下面是一個(gè)簡(jiǎn)單的遞歸凍結(jié)實(shí)現(xiàn):

const deepFreeze = obj => {
? Object.keys(obj).forEach(prop => {
? ? if (typeof obj[prop] === 'object') {
? ? ?? ?deepFreeze(obj[prop]);
? ? }
? });
? return Object.freeze(obj);
};

deepFreeze(user);

Object.freeze()方法除了可以用來(lái)凍結(jié)對(duì)象以外,還可以用于凍結(jié)數(shù)組,使其不可變:

const number = [1, 2, 3, 4, 5];
const freezeNumber = Object.freeze(number);
freezeNumber.push(6);

此時(shí)就會(huì)報(bào)錯(cuò)了:

VM210:3 Uncaught TypeError: Cannot add property 5, object is not extensible

3. Object.seal()

Object.seal() 顧名思義就是密封對(duì)象,它是另一種使對(duì)象不可變的方法。相對(duì)于freeze(),Object.seal() 方法僅保護(hù)對(duì)象不能添加和刪除屬性,它允許更新現(xiàn)有的屬性。

const user = {
?? ?name: 'CUGGZ',
? age: 24,
}

const sealUser = Object.seal(user);
sealUser.age = 18;
delete sealUser.name;
console.log(sealUser) ? // {name: 'CUGGZ', age: 18}

可以看到,我們識(shí)圖刪除對(duì)象中的name屬性,刪除失??;而修改已有的age屬性,修改成功。?

Object.seal()方法和Object.freeze()一樣,對(duì)于嵌套的對(duì)象,是無(wú)法實(shí)現(xiàn)不可變的,如果想要實(shí)現(xiàn),同樣要使用遞歸來(lái)一層層來(lái)密封對(duì)象。?

JavaScript同樣提供了一個(gè)Object.isSealed() 方法來(lái)確認(rèn)對(duì)象的密封狀態(tài):

Object.isSealed(user) ? ? ?// false
Object.isSealed(sealUser) ?// true

4. const關(guān)鍵字?

你是否會(huì)認(rèn)為,使用const關(guān)鍵字也能達(dá)到相同的結(jié)果呢?實(shí)際上,他們是不一樣的,當(dāng)我們使用const關(guān)鍵字來(lái)創(chuàng)建對(duì)象時(shí),它會(huì)阻止我們重新分配值,但是我們可以更新、添加、刪除已有對(duì)象的屬性:

const user = {
?? ?name: 'CUGGZ',
? age: 24,
}

delete user.age;
user.height = 180;
user.name = 'hello';
console.log(user); ?// {name: 'hello', height: 180}

而如果我們給user重新賦值,那么就會(huì)報(bào)錯(cuò)了:

Uncaught TypeError: Assignment to constant variable.

因此,const關(guān)鍵字僅僅是提供了賦值的不變性,而不會(huì)提供值的不變性(對(duì)于對(duì)象來(lái)說(shuō))。

5. 總結(jié)

本文簡(jiǎn)單介紹了兩種可以用于使JavaScript不可變的方法。簡(jiǎn)而言之,Object.seal()方法會(huì)阻止更新、刪除和向?qū)ο筇砑有聦傩?,Object.seal()只會(huì)阻止添加和刪除屬性。、

除此之外,JavaScript還提供了一個(gè)Object.preventExtensions()方法,該方法可以讓一個(gè)對(duì)象變的不可擴(kuò)展,也就是永遠(yuǎn)不能再添加新的屬性。

const user = {
?? ?name: 'CUGGZ',
? age: 24,
}

const newUser = Object.preventExtensions(user);
newUser.height = 180;
console.log(newUser); ?// ?{name: 'CUGGZ', age: 24}

最后來(lái)看看它們?nèi)齻€(gè)的對(duì)比:

方法/操作讀取創(chuàng)建更新刪除
Object.freeze()?????
Object.seal()??????
Object.preventExtensions()???????

到此這篇關(guān)于JavaScript 對(duì)象不變性介紹的文章就介紹到這了,更多相關(guān)JavaScript 對(duì)象不變性?xún)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一個(gè)簡(jiǎn)單的js動(dòng)畫(huà)效果代碼

    一個(gè)簡(jiǎn)單的js動(dòng)畫(huà)效果代碼

    前段時(shí)間為了做動(dòng)畫(huà),學(xué)習(xí)了一下tween算法的使用,這幾天根據(jù)tween算法,然后根據(jù)各種材料參考,做了一個(gè)簡(jiǎn)單的動(dòng)畫(huà)函數(shù).
    2010-07-07
  • 微信小程序之發(fā)送短信倒計(jì)時(shí)功能

    微信小程序之發(fā)送短信倒計(jì)時(shí)功能

    這篇文章主要介紹了微信小程序之發(fā)送短信倒計(jì)時(shí)功能,需要的朋友可以參考下
    2017-08-08
  • 微信小程序開(kāi)發(fā)常用功能匯總

    微信小程序開(kāi)發(fā)常用功能匯總

    這篇文章主要介紹了微信小程序開(kāi)發(fā)常用功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Extjs4中tree的拖拽功能(可以?xún)煽脴?shù)之間拖拽) 簡(jiǎn)單實(shí)例

    Extjs4中tree的拖拽功能(可以?xún)煽脴?shù)之間拖拽) 簡(jiǎn)單實(shí)例

    這篇文章主要介紹了Extjs4中tree的拖拽功能簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下
    2013-12-12
  • Electron點(diǎn)擊穿透不規(guī)則窗體的透明區(qū)域的實(shí)現(xiàn)

    Electron點(diǎn)擊穿透不規(guī)則窗體的透明區(qū)域的實(shí)現(xiàn)

    本文主要介紹了Electron點(diǎn)擊穿透不規(guī)則窗體的透明區(qū)域的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • JavaScript中在光標(biāo)處插入添加文本標(biāo)簽節(jié)點(diǎn)的詳細(xì)方法

    JavaScript中在光標(biāo)處插入添加文本標(biāo)簽節(jié)點(diǎn)的詳細(xì)方法

    本文主要介紹了JavaScript中在光標(biāo)處插入添加文本標(biāo)簽節(jié)點(diǎn)的詳細(xì)方法。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • 最新評(píng)論