Actualmente estoy estudiando para una entrevista técnica y solo estoy pasando por la rutina de leetcode. Encontré una pregunta que aparentemente la compañía en la que estoy a punto de entrevistar me hace con bastante frecuencia, así que lo intenté. No pude entenderlo, así que busqué la solución y encontré esta solución.
var merge = function(intervals) { if(!intervals.length) return intervals; intervals = intervals.sort((a,b) => a[0] - b[0]) let prev = intervals[0]; let res = [prev]; for(let curr of intervals){ if(curr[0] <= prev[1]){ prev[1] = Math.max(prev[1], curr[1]); } else { res.push(curr); prev = curr; } } return res; };en la línea 5, res se establece en igual a [prev], que en este caso es [1,3], por lo que
res = [[1,3]]por ahora.
Luego, a medida que avanza el código, observe cómo se actualiza el valor de prev. Pensé que esto era extraño ya que la resolución nunca se actualiza en absoluto, pero al actualizar el valor de prev, la res interna anterior también se actualiza. Mi pregunta es:
¿Cómo actualizar el valor de anterior actualiza el valor de anterior que está dentro de res? Pensé que me estaba volviendo loco, así que lo probé y esta solución funcionó. Pensé que una vez que se haya asignado la resolución interna anterior, ¿sería inmutable? ¿Me estoy perdiendo de algo?
let prev = intervals[0]; let res = [prev]; En este punto, res[0] , prev e intervals[0] tienen el mismo valor.
console.log(prev === res[0]); // true console.log(prev === intervals[0]); // true console.log(res[0] === intervals[0]); // true Si este valor hiciera referencia a un objeto, entonces todos apuntan al objeto. Si tuviera que reasignar prev , eso no modifica res[0] , ni intervals[0] .
prev = 'something else'; console.log(prev === res[0]); // FALSE console.log(prev === intervals[0]); // FALSE console.log(res[0] === intervals[0]); // true¿Cómo actualizar el valor de anterior actualiza el valor de anterior que está dentro de res?
Puede ver en este ejemplo que actualizar el valor de prev en realidad no actualiza el valor de res[0] .
Sin embargo, actualizar el valor de prev[1] en realidad está actualizando el valor del índice 1 del objeto/matriz al que hace referencia prev . En otras palabras, no está cambiando prev al configurar prev[1] = ... está cambiando prev[1] , que es lo mismo que res[0][1] .
Esto sucede porque la referencia de prev está siendo señalada por res cuando haces res=[prev] , básicamente se señala la dirección donde se almacena la matriz prev real, ya que las actualizaciones de prev también muestran cambios en res.
No tiene sentido para usted porque está asumiendo que se está creando una nueva copia de prev cuando hace res = [prev] .
En cambio, intente pensarlo de esta manera: se crea una matriz que internamente apunta a la dirección de memoria de los datos que contiene prev . Cada vez que cambien los datos en esa dirección de memoria, se actualizarán en todos los lugares donde se usó esa dirección.
Leería sobre los tipos de referencia frente a los tipos primitivos.