ES6 Object.assign()的用法及其使用
1.Object.assign()基本用法:
Object.assign方法用來將源對(duì)象(source)的所有可枚舉屬性,復(fù)制到目標(biāo)對(duì)象(target)。它至少需要兩個(gè)對(duì)象作為參數(shù),第一個(gè)參數(shù)是目標(biāo)對(duì)象,后面的參數(shù)都是源對(duì)象。
let targetObj1 = { a: 1 }; let sourceObj1 = { b: 1 }; let sourceObj11 = { c: 3 }; Object.assign(targetObj1, sourceObj1, sourceObj11); console.log(targetObj1);
注:如果目標(biāo)對(duì)象與源對(duì)象有同名屬性,或多個(gè)源對(duì)象有同名屬性,則后面的屬性會(huì)覆蓋前面的屬性。
let targetObj1 = { a: 1, b: 2 }; let sourceObj1 = { b: 1 }; let sourceObj11 = { c: 3 }; Object.assign(targetObj1, sourceObj1, sourceObj11); console.log(targetObj1);
如果只有一個(gè)參數(shù),Object.assign會(huì)直接返回該參數(shù)。
let targetObj1 = { a: 4 } Object.assign(targetObj1); console.log(targetObj1)
如果該參數(shù)不是對(duì)象,則會(huì)先轉(zhuǎn)成對(duì)象,然后返回。
console.log(typeof (Object.assign(2)));
由于undefined和null無法轉(zhuǎn)成對(duì)象,所以如果它們作為參數(shù),就會(huì)報(bào)錯(cuò)。
console.log(typeof(Object.assign(null))); console.log(typeof(Object.assign(underfind)));
注意:如果非對(duì)象參數(shù)出現(xiàn)在源對(duì)象的位置(即非首參數(shù)),那么處理規(guī)則有所不同。首先,這些參數(shù)都會(huì)轉(zhuǎn)成對(duì)象,如果無法轉(zhuǎn)成對(duì)象,就會(huì)跳過。這意味著, 如果undefined和null不在首參數(shù),就不會(huì)報(bào)錯(cuò)。其他類型的值(即數(shù)值、字符串和布爾值)不在首參數(shù),也不會(huì)報(bào)錯(cuò)。但是,除了字符串會(huì)以數(shù)組形式,拷貝入目標(biāo)對(duì)象,其他值都不會(huì)產(chǎn)生效果。
Object.assign只拷貝自身屬性,不可枚舉的屬性(enumerable為false)和繼承的屬性不會(huì)被拷貝。
let obj1 = Object.assign({ dwb: 'zjl' }, Object.defineProperty({}, 'zmf', { enumerable: false, value: 'zmf' }) ) console.log(obj1); let obj2 = Object.assign({ dwb: 'zjl' }, Object.defineProperty({}, 'zmf', { enumerable: true, value: 'zmf' }) ) console.log(obj2);
對(duì)于嵌套的對(duì)象,Object.assign的處理方法是替換,而不是添加。
var target = { a: { b: 'c', d: 'e' } } var source = { a: { b: 'hello' } } Object.assign(target, source);
上面代碼中,target對(duì)象的a屬性被source對(duì)象的a屬性整個(gè)替換掉了,而不會(huì)得到{ a: { b: 'hello', d: 'e' } }的結(jié)果。這通常不是開發(fā)者想要的,需要特別小心。有一些函數(shù)庫(kù)提供Object.assign的定制版本(比如Lodash的_.defaultsDeep方法),可以解決深拷貝的問題。
注意,Object.assign可以用來處理數(shù)組,但是會(huì)把數(shù)組視為對(duì)象。
console.log(Object.assign([1, 2, 3], [4, 5]));
其中,4覆蓋1,5覆蓋2,因?yàn)樗鼈冊(cè)跀?shù)組的同一位置,所以就對(duì)應(yīng)位置覆蓋了。
Object.assign方法實(shí)行的是淺拷貝,而不是深拷貝。也就是說,如果源對(duì)象某個(gè)屬性的值是對(duì)象,那么目標(biāo)對(duì)象拷貝得到的是這個(gè)對(duì)象的引用。
var object1 = { a: { b: 1 } }; var object2 = Object.assign({}, object1); object1.a.b = 2; console.log(object2.a.b);
2.用途
2.1為對(duì)象添加屬性
2.2為對(duì)象添加方法
2.3克隆對(duì)象
function copyFnc(origin) { return Object.assign({}, origin) } var sur = { a: 1, b: 2 }; console.log(copyFnc(sur));
上面代碼將原始對(duì)象拷貝到一個(gè)空對(duì)象,就得到了原始對(duì)象的克隆。
不過,采用這種方法克隆,只能克隆原始對(duì)象自身的值,不能克隆它繼承的值。如果想要保持繼承鏈,可以采用下面的代碼。
function clone(origin) { let originProto = Object.getPrototypeOf(origin); return Object.assign(Object.create(originProto), origin); }
在JS里子類利用Object.getPrototypeOf去調(diào)用父類方法,用來獲取對(duì)象的原型。
2.4 合并多個(gè)對(duì)象
//多個(gè)對(duì)象合并到某個(gè)對(duì)象 const merge = (target, ...sources) => Object.assign(target, ...sources); //多個(gè)對(duì)象合并到新對(duì)象 const merge = (...sources) => Object.assign({}, ...sources);
2.5為屬性指定默認(rèn)值
const DEFAULTS = { logLevel: 0, outputFormat: 'html' }; function processContent(options) { let options = Object.assign({}, DEFAULTS, options); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript類型系統(tǒng)之正則表達(dá)式
正則又叫規(guī)則或模式,是一個(gè)強(qiáng)大的字符串匹配工具。javascript通過RegExp類型來支持正則表達(dá)式,本文給大家介紹javascript類型系統(tǒng)之正則表達(dá)式,對(duì)js正則表達(dá)式相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-01-01網(wǎng)頁(yè)加載時(shí)頁(yè)面顯示進(jìn)度條加載完成之后顯示網(wǎng)頁(yè)內(nèi)容
網(wǎng)頁(yè)加載時(shí)頁(yè)面顯示進(jìn)度條(加載完成時(shí)顯示網(wǎng)頁(yè)內(nèi)容),這種效果在瀏覽網(wǎng)頁(yè)很常見,本文也介紹一種實(shí)現(xiàn)方法,需要了解的朋友可以參考下2012-12-12關(guān)于ES6新特性最常用的知識(shí)點(diǎn)匯總
日常開發(fā)中寫的 JavaScript 代碼,會(huì)用到ES6的部分新特性,所以下面這篇文章主要給大家介紹了關(guān)于ES6新特性最常用的知識(shí)點(diǎn),文章總結(jié)的非常全面,需要的朋友可以參考下2021-11-11nullJavascript中創(chuàng)建對(duì)象的五種方法實(shí)例
今天上午,非常郁悶,有很多簡(jiǎn)單基礎(chǔ)的問題搞得我有些迷茫,哎,代碼幾天不寫就忘。目前又不當(dāng)COO,還是得用心記代碼哦!2013-05-05對(duì)于input 框限定輸入值為浮點(diǎn)型的js代碼
下面小編就為大家?guī)硪黄獙?duì)于input 框限定輸入值為浮點(diǎn)型的js代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09JS一維數(shù)組轉(zhuǎn)多維數(shù)組樹的方法
這篇文章主要介紹了JS一維數(shù)組轉(zhuǎn)多維數(shù)組樹的方法,文章通過代碼示例給大家講解的非常詳細(xì),?對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-06-0625個(gè)讓你眼前一亮的JavaScript代碼技巧分享
學(xué)習(xí)強(qiáng)大的JavaScript一行代碼,能夠節(jié)省你的時(shí)間和代碼量,所以本文為大家整理了25個(gè)JavaScript實(shí)用代碼技巧,感興趣的小伙伴可以了解一下2023-07-07JavaScript設(shè)計(jì)模式之構(gòu)造函數(shù)模式實(shí)例教程
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之構(gòu)造函數(shù)模式,結(jié)合實(shí)例形式分析了構(gòu)造函數(shù)模式的概念、功能、定義及使用方法,需要的朋友可以參考下2018-07-07