Me pregunto si el siguiente fragmento de código es una posible pérdida de memoria.
let arrOfObj = [ { a: 0, b: 0 } ] const copy = [ ...arrOfObj ] copy[0].a = 5; console.log(arrOfObj) // [ { a: 5, b: 0 } ] console.log(copy) // [ { a: 5, b: 0 } ] arrOfObj = [] console.log(arrOfObj) // [] console.log(copy) // [ { a: 5, b: 0 } ]El operador de propagación solo hará una copia superficial, por lo que el objeto dentro de la matriz sería una referencia. Pero, ¿de dónde obtuvo javascript los valores en el último registro? ¿Se recolectarán basura cuando vacíe la matriz?
No, no hay pérdida de memoria. Desglosando los pasos para una mejor explicación:
const copy = [...arrOfObj] : asigna espacio en el montón de memoria y lo asigna a la variable de copy . Dado que spread realiza una copia superficial, la referencia del objeto sigue siendo la misma dentro de la matriz.copy[0].a = 5; : actualiza el valor del objeto dentro de la matriz de copy . Dado que la referencia al objeto es la misma tanto para copy como para arrOfObj , se refleja en ambas matrices.arrOfObj = [] : asigna espacio en el montón de memoria para [] y lo asigna a la variable arrOfObj . Esto no implica que la copy pierda su referencia a la matriz que creó anteriormente. la copy aún apunta a la referencia de memoria más antigua. Por lo tanto, copy imprime el objeto que contiene la matriz anterior y arrOfObj imprime una matriz vacía. Para profundizar más en esto, incluso si hace lo siguiente, la copy aún apuntaría a una referencia de memoria más antigua:
let arrOfObj = [ { a: 0, b: 0 } ] // instead of spread, assign it directly const copy = arrOfObj; copy[0].a = 5; console.log(arrOfObj) // [ { a: 5, b: 0 } ] console.log(copy) // [ { a: 5, b: 0 } ] // assign empty array to 'arrOfObj' arrOfObj = [] console.log(arrOfObj) // [] console.log(copy) // [ { a: 5, b: 0 } ] => still prints the array Además, el valor anterior de arrOfObj "puede" recolectar basura (depende de las optimizaciones del motor JS)