En nodejs, trato de actualizar la variable global exportada desde otro archivo y verifico el resultado nuevamente. Los valores de la variable en el archivo original y el archivo importado son diferentes.
Ejecuto el archivo test.js y compruebo el resultado. El resultado de gDataChange en DataCommon.js y test.js es diferente aunque es la misma variable.
En DataCommon.js , exporté la variable gDataChange
let gDataChange = []; function printArray() { console.log('DataCommon.js call ', gDataChange); } function setArray(lArray) { gDataChange = [...lArray]; } module.exports = { gDataChange, printArray, setArray }En test.js , inserto algunos datos en la matriz global y llamo a la función setArray para cambiarla.
var { gDataChange, printArray, setArray} = require('../../res/DataCommon.js'); if (!gDataChange.length) { gDataChange.push(1); gDataChange.push(2); gDataChange.push(1); gDataChange.push(3); } function testGlobalVar() { let newData = [...gDataChange]; newData = newData.filter((number)=>{ return number != 1; }); setArray(newData); } testGlobalVar(); console.log('test.js call ', gDataChange); printArray(); setTimeout(() => { console.log(gDataChange); }, 10000);Si usé array.splice() , el gDataChange de 2 archivos es el mismo . Pero si usé array.filter() y reasigné una matriz como la anterior, el gDataChange de 2 archivos es diferente. No estoy seguro de que gDataChange se cree en el nuevo cuando reasigné con array.filter() porque no puedo verificar la dirección de una variable en este caso.
El sistema de módulos de Node.js es Singleton y almacenamiento en caché de módulos, el sistema de módulos se refiere exactamente al mismo archivo una y otra vez. Por ejemplo:
contador.js
let value = 0 module.exports = { increment: () => value++, get: () => value, }aplicación.js
const counter1 = require('./counter.js') const counter2 = require('./counter.js') counter1.increment() counter1.increment() counter2.increment() console.log(counter1.get()) // prints 3 console.log(counter2.get()) // also prints 3 En tu caso, está sucediendo de la misma manera. Sin embargo, está cambiando la referencia de su matriz gDataChange . Compruebe el siguiente código:
let arr = [1, 2, 3, 4]; const arr1 = arr.filter(x => x % 2 === 0); // this filter returns new array that refers to the new filtered data. console.log(arr1); // new array const arrOld = arr; // assigned reference of old array to new variable arr = arr1; // assigning filtered data reference to arr console.log(arr, arrOld); // you are seeing this in your code.Entonces, el cambio en los valores no se debe al nodo, sino a que está cambiando la referencia a los objetos. Así es como funcionan los objetos JS. Incluso cuando asigna los valores de la matriz de filtro, está creando una nueva matriz.
let gDataChange = []; function printArray() { console.log('DataCommon.js call ', gDataChange); } function setArray(lArray) { gDataChange = [...lArray]; // here a new array reference with filter values are assigned. // now if you change anything in the filter array it won't reflect here. } module.exports = { gDataChange, printArray, setArray }Puede comprobar cómo se resuelven los módulos de nodo .