Tengo un objeto con varios métodos que se ve así:
export const myObject = { method1: function (arr, value) { this.method2(arr, value) this.method3(arr).filter(item => item === 'something') }, method2: function (arr, value) { if (true) { value = 'change this value' if (true) { value = 'then change this' arr = [...arr.slice(0, -1)] } } arr = [...arr, value] return arr }, method3: function (arr) { switch(arr.at(-1)) { case 1: arr = [...arr, 2] break case 2: arr = [...arr, 1] break default: arr = [...arr] } return this },Mi problema es que cuando llamo al método 2 desde el método 1, recibo la misma referencia y no la matriz mutada. Si coloco los registros de la consola en mi código, puedo ver los cambios:
myObject = { method1: function (value) { console.log('here my value is 10') this.method2(value) console.log('here my value is 10 again') }, method2: function (value) { value = value + 10 console.log('here my value is 20') return value console.log('see second log in method 1') },Ya intenté cambiar los nombres de las variables y usar diferentes formas de insertar los valores antiguos en la matriz, pero siempre tengo el mismo problema: el valor devuelto es la matriz original.
Mi método 2 funciona porque estoy usando varios componentes en la aplicación, el problema es cuando llamo a este método desde un método hermano, con respecto al método 3, puedo colocar esa función dentro del método 1 porque no se necesita en ningún otro lugar, pero method2 como dije se reutiliza en otros componentes.
¿Qué estoy haciendo mal aquí? Lo siento si no estoy claro, esta es mi primera publicación en la comunidad, tiene el código relacionado aquí y la aplicación de trabajo aquí: React Calculator
Los parámetros de Javascript siempre se pasan por valor. Puede cambiar las propiedades del valor que pasa y esos cambios serán visibles para el método de llamada. Pero si cambia el parámetro para que apunte a una referencia diferente, ese cambio no será visible para el método de llamada.
Por ejemplo:
function A(arr) { arr[0] = 42; console.debug("Inside A", arr); // Output: [42, 1, 2, 3] } function B(arr) { arr = arr.slice(1); console.debug("Inside B", arr); // Output: [1, 2, 3] } let x = [0, 1, 2, 3]; console.debug("Initial", x); // Output: [0, 1, 2, 3] A(x); console.debug("After A", x); // Output: [42, 1, 2, 3] B(x); console.debug("After B", x); // Output: [42, 1, 2, 3] Los cambios realizados por A son visibles fuera de la función, porque simplemente cambia una propiedad en el objeto que se pasó.
Los cambios realizados por B NO son visibles fuera de la función, porque reasignó el parámetro para referirse a una instancia de objeto diferente.
En su ejemplo, puede obtener la matriz actualizada utilizando el valor de retorno de method2 :
method1: function (arr, value) { arr = this.method2(arr, value); this.method3(arr).filter(item => item === 'something') } Sin embargo, no puede obtener la matriz actualizada de method3 .