2016-07-19 229 views
5

AvereDifferenza tra Object.assign e l'oggetto si diffuse

var obj = { a: 1, b: 2}; 

Quali sono le differenze tra

obj = Object.assign(obj, { c: 3}); 

E

obj = {...obj, c: 3 }; 
+0

Controllare [versione compilata] (https://babeljs.io/repl/#?evaluate=false&lineWrap=false&presets=es2015%2Cstage-2&code=obj%20%3D%20%7B. ..obj% 2C% 20% 20c% 3A% 203% 20% 7D% 3B) e [proposta] (https://github.com/sebmarkbage/ecmascript-rest-spread) –

+0

OK, quindi l'operatore di spread per oggetto letterali non è ES6, mentre 'Object.assign' è. – ftor

risposta

16

La differenza è che quando si utilizza uno spread si è sempre creazione di un nuovo oggetto:

const a = { name: 'Joe Bloggs' } 
 
const b = { ...a, age: 27 }; 
 

 
console.log(a === b) //=> false

Tuttavia usando Object.assign è possibile mutare un oggetto esistente:

const a = { name: 'Joe Bloggs' } 
 
const b = Object.assign(a, { age: 27 }); 
 

 
console.log(a === b) //=> true

È ancora possibile ottenere il comportamento di uno spread oggetto con Object.assign passando un oggetto letterale come primo argomento:

const a = { name: 'Joe Bloggs' } 
 
const b = Object.assign({}, a, { age: 27 }); 
 

 
console.log(a === b) //=> false

+0

Poiché non è possibile specificare un obiettivo con la diffusione dell'oggetto e quindi non è possibile modificare gli oggetti esistenti, è in realtà più sicuro di "Object.assign" e di più consice. – ftor