国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

在JavaScript中,Object.assign()方法或展開(kāi)語(yǔ)法(...)來(lái)合并對(duì)象,Object.freeze()方法來(lái)凍結(jié)對(duì)象,防止對(duì)象被修改

這篇具有很好參考價(jià)值的文章主要介紹了在JavaScript中,Object.assign()方法或展開(kāi)語(yǔ)法(...)來(lái)合并對(duì)象,Object.freeze()方法來(lái)凍結(jié)對(duì)象,防止對(duì)象被修改。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、Object.freeze()方法來(lái)凍結(jié)對(duì)象,防止對(duì)象被修改

Object.freeze() 是JavaScript中的一個(gè)方法,用于凍結(jié)一個(gè)對(duì)象。被凍結(jié)的對(duì)象不能再被修改。具體來(lái)說(shuō),它做了兩件事情:

防止添加新的屬性:嘗試添加新屬性將失敗,不會(huì)拋出錯(cuò)誤,但新屬性不會(huì)被添加到對(duì)象中。
防止刪除屬性:嘗試刪除對(duì)象的任何屬性都將失敗,不會(huì)拋出錯(cuò)誤。
但請(qǐng)注意,它不會(huì)防止修改對(duì)象已有的屬性值。也就是說(shuō),你仍然可以更改、替換或修改對(duì)象上現(xiàn)有的屬性。

我們都知道const定義基本數(shù)據(jù)類型,這個(gè)值是不可以修改的。那么我們用const定義對(duì)象,可以修改對(duì)象嗎?

const a = 5
// a = 10  // TypeError: Assignment to constant variable.

const obj = {
    name: '張三'
}
obj.name = '李四'
console.log(obj)    // {name: "李四"}

答案是肯定的。那么如果我們想定義一個(gè)不可被修改的對(duì)象,應(yīng)該怎么辦呢!
那就要用到Object.freeze()了。
它的作用是凍結(jié)一個(gè)對(duì)象,被凍結(jié)的對(duì)象有以下幾個(gè)特性:

  • 不能添加新屬性
  • 不能刪除已有屬性
  • 不能修改已有屬性的值
  • 不能修改原型
  • 不能修改已有屬性的可枚舉性、可配置性、可寫(xiě)性
1、基本使用
var obj = {
    name: '張三',
    age: 18,
    address: '上海市'
}
obj.__proto__.habit = '運(yùn)動(dòng)'
 
// 凍結(jié)對(duì)象
Object.freeze(obj)
 
// 不能添加新屬性
obj.sex = '男'
console.log(obj)    // {name: "張三", age: 18, address: "上海市"}
 
// 不能刪除原有屬性
delete obj.age
console.log(obj)    // {name: "張三", age: 18, address: "上海市"}
 
// 不能修改已有屬性的值
obj.name = '李四'
console.log(obj)    // {name: "張三", age: 18, address: "上海市"}
 
// 不能修改原型
obj.__proto__ = '隨便什么值'
console.log(obj.__proto__)  // {habit: "運(yùn)動(dòng)", constructor: ?, __defineGetter__: ?, __defineSetter__: ?, hasOwnProperty: ?, …}
 
// 不能修改已有屬性的可枚舉性、可配置性、可寫(xiě)性
Object.defineProperty(obj,'address',{ // TypeError: Cannot redefine property: address
    enumerable: false,// 表示是否可以枚舉。直接在對(duì)象上定義的屬性,基本默認(rèn)true
    configurable: false,// 表示能否通過(guò)delete刪除屬性,能否修改屬性的特性
    writable: true// 表示能否修改屬性的值。直接在對(duì)象上定義的屬性,基本默認(rèn)true
})

這里要注意一點(diǎn),Object.freeze()的返回值就是被凍結(jié)的對(duì)象,該對(duì)象完全等于傳入的對(duì)象,所以我們一般不需要接收返回值。上面我們對(duì)對(duì)象進(jìn)行了凍結(jié),那么我們可以凍結(jié)數(shù)組嗎?

2、凍結(jié)數(shù)組
var arr = [1,2,3,4,5]
Object.freeze(arr)
arr[0]='新值'
console.log(arr)    // [1, 2, 3, 4, 5]

其實(shí)很容易能想明白,數(shù)組本質(zhì)也就是對(duì)象,只不過(guò)對(duì)象的key是下標(biāo),所以也可以凍結(jié)。如果我的對(duì)象里還有對(duì)象呢,那么凍結(jié)是否依然有效?

2.1、淺凍結(jié)
var obj = {
    name: '張三',
    info: {
        a: 1,
        b: 2
    }
}
Object.freeze(obj)

obj.name = '李四'
console.log(obj)    // {info: {a: 1, b: 2},name: "張三"}

obj.info.a = 66
console.log(obj.info)   // {a: 66, b: 2}

可以看到對(duì)象中如果還有對(duì)象的時(shí)候,Object.freeze()失效了。Object.freeze()只支持淺凍結(jié),下面我們封裝一個(gè)深凍結(jié)函數(shù),日后可直接使用

2.1、深凍結(jié)
var obj = {
    name: '張三',
    info: {
        a: 1,
        b: 2
    }
}

function deepFreeze(obj) {
    // 獲取所有屬性
    var propNames = Object.getOwnPropertyNames(obj)
 
    // 遍歷
    propNames.forEach(item => {
        var prop = obj[item]
        // 如果某個(gè)屬性的屬性值是對(duì)象,則遞歸調(diào)用
        if (prop instanceof Object && prop !== null) {
            deepFreeze(prop)
        }
    })

    // 凍結(jié)自身
    return Object.freeze(obj)
}

deepFreeze(obj)

obj.name = '李四'
console.log(obj)    // {name: "張三", info: {…}}

obj.info.a = 100
console.log(obj.info)   // {a: 1, b: 2}
3、應(yīng)用場(chǎng)景

Object.freeze()可以提高性能,如果你有一個(gè)對(duì)象,里面的內(nèi)容特別特別多,而且都是一些靜態(tài)數(shù)據(jù),你確保不會(huì)修改它們,那你其實(shí)可以用Object.freeze()凍結(jié)起來(lái),這樣可以讓性能大幅度提升,提升的效果隨著數(shù)據(jù)量的遞增而遞增。一般什么時(shí)候用呢?對(duì)于純展示的大數(shù)據(jù),都可以使用Object.freeze提升性能。

4、Vue中使用Object.freeze

在vue項(xiàng)目中,data初始化 里面一般會(huì)有很多變量,后續(xù)如果不想使用它,可以使用Object.freeze()。這樣可以避免vue初始化時(shí)候,做一些無(wú)用的操作,從而提高性能。

data(){
    return{
        list:Object.freeze({'我不需要改變'})
    }
}

二、Object.assign()方法或展開(kāi)語(yǔ)法(…)來(lái)合并對(duì)象

在JavaScript中,你可以使用Object.assign()方法或者使用Spread Operator (…) 來(lái)合并對(duì)象。

1、Object.assign()

Object.assign() 靜態(tài)方法將一個(gè)或者多個(gè)源對(duì)象中所有可枚舉的自有屬性復(fù)制到目標(biāo)對(duì)象,并返回修改后的目標(biāo)對(duì)象。

1.1、語(yǔ)法
Object.assign(target, ...sources)
1.2、參數(shù)
  • target:需要應(yīng)用源對(duì)象屬性的目標(biāo)對(duì)象,修改后將作為返回值。

  • sources:一個(gè)或多個(gè)包含要應(yīng)用的屬性的源對(duì)象。

1.3、示例
let name = { name:'sea' },age = { age:15 },person= {}

Object.assign(person,name,age)

console.log(person) 
//{ name:'sea',age:15 }

在這個(gè)例子中,Object.assign()方法創(chuàng)建了一個(gè)新的對(duì)象,其屬性是所有傳入對(duì)象的屬性的拷貝。

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };

const returnedTarget = Object.assign(target, source);

console.log(target);
// Expected output: Object { a: 1, b: 4, c: 5 }

console.log(returnedTarget === target);
// Expected output: true

如果目標(biāo)對(duì)象與源對(duì)象具有相同的鍵(屬性名),則目標(biāo)對(duì)象中的屬性將被源對(duì)象中的屬性覆蓋,后面的源對(duì)象的屬性將類似地覆蓋前面的源對(duì)象的同名屬性。

2、展開(kāi)語(yǔ)法Spread Operator (…)

淺拷貝 (Shallow-cloning,不包含 prototype) 和對(duì)象合并,可以使用更簡(jiǎn)短的展開(kāi)語(yǔ)法。而不必再使用 Object.assign() 方式。

Spread運(yùn)算符也可以用來(lái)合并對(duì)象。它可以將一個(gè)數(shù)組或?qū)ο笳归_(kāi)到一個(gè)函數(shù)或數(shù)組中。

let name = { name:'sea' },age = { age:15 }

let person = { ...name,...age }

console.log(person)
//{ name:'sea',age:15 }

在這個(gè)例子中,Spread Operator (…) 用于擴(kuò)展對(duì)象,所以它復(fù)制了所有對(duì)象的屬性到新的對(duì)象中。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-785684.html

var obj1 = { foo: "bar", x: 42 };
var obj2 = { foo: "baz", y: 13 };

var clonedObj = { ...obj1 };
// 克隆后的對(duì)象:{ foo: "bar", x: 42 }

var mergedObj = { ...obj1, ...obj2 };
// 合并后的對(duì)象:{ foo: "baz", x: 42, y: 13 }
3、區(qū)別
  • Object.assign() 函數(shù)會(huì)觸發(fā) setters,而展開(kāi)語(yǔ)法則不會(huì)。

到了這里,關(guān)于在JavaScript中,Object.assign()方法或展開(kāi)語(yǔ)法(...)來(lái)合并對(duì)象,Object.freeze()方法來(lái)凍結(jié)對(duì)象,防止對(duì)象被修改的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • el-table展開(kāi)和合并都觸發(fā)的事件方法

    el-table展開(kāi)和合并都觸發(fā)的事件方法

    ?el-table組件可以通過(guò)設(shè)置expand-change事件來(lái)監(jiān)聽(tīng)展開(kāi)和合并操作的觸發(fā)??梢栽趀l-table上添加一個(gè)expand-change事件處理方法

    2024年02月10日
    瀏覽(16)
  • Object.assign詳解

    目錄 一、Object.assign是什么? 二、用法: 三、詳細(xì)講解 1.目標(biāo)對(duì)象和源對(duì)象沒(méi)有同名屬性 2.目標(biāo)對(duì)象和源對(duì)象有同名屬性 3.有多個(gè)源對(duì)象 4、原始類型會(huì)被包裝為對(duì)象 5、對(duì)象的拷貝 6、對(duì)象的深拷貝 7、對(duì)象的深拷貝 總結(jié) object.assign()主要用于對(duì)象合并,將源對(duì)象中的屬性復(fù)

    2023年04月14日
    瀏覽(14)
  • 【JS學(xué)習(xí)】Object.assign 用法介紹

    Object.assign 是ES6中的一個(gè)方法。該方法能夠?qū)崿F(xiàn)對(duì)象的淺復(fù)制以及對(duì)象合并。 Object.assign 并不會(huì)修改目標(biāo)對(duì)象本身,而是返回一個(gè)新的對(duì)象,其中包含了所有源對(duì)象的屬性。 例1 2個(gè)對(duì)象合并 上述例子中,mergedObject 是合并了 target 和 source 的屬性的新對(duì)象。其中 target 對(duì)象的

    2024年02月12日
    瀏覽(16)
  • 記錄--Object.assign 這算是深拷貝嗎

    記錄--Object.assign 這算是深拷貝嗎

    在JavaScript中,Object.assign() 是一個(gè)用于合并對(duì)象屬性的常見(jiàn)方法。然而,對(duì)于許多開(kāi)發(fā)者來(lái)說(shuō),關(guān)于它是否執(zhí)行深拷貝的認(rèn)識(shí)可能存在一些混淆。先說(shuō)答案 Object.assign() 不屬于深拷貝,我們接著往下看。 首先,讓我們回顧一下 Object.assign() 的基本用法。該方法用于將一個(gè)或多個(gè)

    2024年01月18日
    瀏覽(13)
  • Vue2和vue3中雙向數(shù)據(jù)綁定的原理,ES6的Proxy對(duì)象代理和JavaScript的Object.defineProperty,使用詳細(xì)

    簡(jiǎn)介: Object.defineProperty大家都知道,是vue2中雙向數(shù)據(jù)綁定的原理,它 是 JavaScript 中一個(gè)強(qiáng)大且常用的方法,用于定義對(duì)象屬性,允許我們精確地控制屬性的行為,包括讀取、寫(xiě)入和刪除等操作; 而Proxy是vue3中雙向數(shù)據(jù)綁定的原理,是ES6中一種用于創(chuàng)建代理對(duì)象的特殊對(duì)象,

    2024年02月15日
    瀏覽(46)
  • 【Python】成功解決TypeError: ‘tuple‘ object does not support item assignment

    【Python】成功解決TypeError: ‘tuple‘ object does not support item assignment

    【Python】成功解決TypeError: ‘tuple’ object does not support item assignment ?? 個(gè)人主頁(yè):高斯小哥 ?? 高質(zhì)量專欄:Matplotlib之旅:零基礎(chǔ)精通數(shù)據(jù)可視化、Python基礎(chǔ)【高質(zhì)量合集】、PyTorch零基礎(chǔ)入門(mén)教程?? 希望得到您的訂閱和支持~ ?? 創(chuàng)作高質(zhì)量博文(平均質(zhì)量分92+),分享更多關(guān)

    2024年03月15日
    瀏覽(35)
  • 【JavaScript】對(duì)象 ② ( 對(duì)象使用 | 調(diào)用對(duì)象屬性 | 調(diào)用對(duì)象方法 | 變量與屬性區(qū)別 | 函數(shù)與方法區(qū)別 )

    【JavaScript】對(duì)象 ② ( 對(duì)象使用 | 調(diào)用對(duì)象屬性 | 調(diào)用對(duì)象方法 | 變量與屬性區(qū)別 | 函數(shù)與方法區(qū)別 )

    使用字面量創(chuàng)建對(duì)象要點(diǎn) : 在上一篇博客 【JavaScript】對(duì)象 ① ( 對(duì)象概念 | 對(duì)象使用場(chǎng)景 | 使用字面量創(chuàng)建對(duì)象 | 空對(duì)象字面量 | 小括號(hào) / 中括號(hào) / 大括號(hào) 作用 ) 中 , 介紹了 使用 字面量 創(chuàng)建對(duì)象 , 有如下要點(diǎn) : 鍵值對(duì) : 對(duì)象字面量 中的 屬性 和 方法 都是以 \\\" 鍵值對(duì) \\\" 的形

    2024年04月14日
    瀏覽(26)
  • JavaScript—數(shù)據(jù)類型、對(duì)象與構(gòu)造方法

    JavaScript—數(shù)據(jù)類型、對(duì)象與構(gòu)造方法

    JavaScript(簡(jiǎn)稱“JS”) 是一種具有函數(shù)優(yōu)先的輕量級(jí),解釋型或即時(shí)編譯型的編程語(yǔ)言。JavaScript 基于原型編程、多范式的動(dòng)態(tài)腳本語(yǔ)言,并且支持面向?qū)ο?、命令式、聲明式、函?shù)式編程范式。 (1)腳本語(yǔ)言。js不編譯,直接解釋執(zhí)行 (2)基于對(duì)象。JavaScript是一種基于對(duì)象的

    2024年02月10日
    瀏覽(24)
  • JavaScript:js數(shù)組/對(duì)象遍歷方法

    一、js遍歷方法 序號(hào) 方法 描述 1 for 使用最基本的for循環(huán)可以遍歷數(shù)組 2 for of for...of語(yǔ)句用來(lái)遍歷可迭代對(duì)象(包括數(shù)組、Set、Map、字符串等),它可以替代傳統(tǒng)的for循環(huán)和forEach()方法。for...of循環(huán)每次迭代都將返回一個(gè)值,而不是索引。 3 for in for...in語(yǔ)句用來(lái)遍歷對(duì)象的可

    2024年02月09日
    瀏覽(29)
  • es6 ...展開(kāi)語(yǔ)法

    ES6中的...(展開(kāi))語(yǔ)法是一種可以將數(shù)組或?qū)ο笳归_(kāi)為函數(shù)參數(shù)或數(shù)組字面量的語(yǔ)法。它通常用于函數(shù)調(diào)用或數(shù)組字面量的展開(kāi)。 在函數(shù)調(diào)用中,...可以將一個(gè)數(shù)組展開(kāi)為函數(shù)的參數(shù)列表。例如: js 復(fù)制代碼 ? function sum( a, b, c) { ? return a + b + c; ? } ? ? ? const numbers = [ 1,

    2024年02月05日
    瀏覽(18)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包