Tuesday, 18 January 2022

JS - object && array are by reference only by copy if new array / objects returned such as filter

 // Reference

var a = [{test:1}];

undefined

var b = a ;

undefined

b[0].test = 2

2

[{…}]0: {test: 2}length: 1[[Prototype]]: Array(0)

[{…}]0: {test: 2}length: 1[[Prototype]]: Array(0)



// reference, although filter returns a new array, object still reference

var c = a.filter( item => item.test === 2)
undefined
c
c[0].test = 33333
33333
c
  1. [{…}]
    1. length1
a
  1. [{…}]





// Copy

var d = Object.assign({}, a[0])

undefined

{test: 33333}

d.test = 4444444

4444444

{test: 4444444}

[{…}]0: {test: 33333}length: 1[[Prototype]]: Array(0)



// Array.map returns a new array, if non objects.

var a = [1,2,3]

undefined

b = a.map( row=>row)

(3) [1, 2, 3]

b.push(4)

4

(4) [1, 2, 3, 4]

(3) [1, 2, 3]



 // however, if there are objects in the array, they are still by reference 

var a = [{test:1}]

undefined

b = a.map(row=>row)

[{…}]

b[0].test = 22

22

[{…}]0: {test: 22}length: 1[[Prototype]]: Array(0)

[{…}]0: {test: 22}length: 1[[Prototype]]: Array(0)



// To fix use Object.assign in map

var a = [{test:1}]

undefined

b = a.map(row=>Object.assign({},row))

[{…}]

b[0].test = 3333

3333

[{…}]0: {test: 3333}length: 1[[Prototype]]: Array(0)

a

[{…}]0: {test: 1}length: 1[[Prototype]]: Array(0)



No comments:

Post a Comment