在nodejs中,我嘗試更新從另一個檔案匯出的全域變數并再次檢查結果。原始檔案和匯入檔案中變數的值不同。
我運行檔案 test.js并檢查結果。DataCommon.js 和 test.js 中 gDataChange 的結果雖然是同一個變數,但結果不同。
在DataCommon.js,我出口gDataChange變數
let gDataChange = [];
function printArray()
{
console.log('DataCommon.js call ', gDataChange);
}
function setArray(lArray)
{
gDataChange = [...lArray];
}
module.exports = {
gDataChange,
printArray,
setArray
}
在test.js 中,我將一些資料推入全域陣列并呼叫函式 setArray 來更改它。
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);

如果我使用array.splice(),則2 個檔案的gDataChange是相同的。但是如果我使用array.filter()并像上面那樣重新分配陣列,則 2 個檔案的 gDataChange 是不同的。當我用array.filter()重新分配時,我不確定 gDataChange 是否被創建為新的,因為在這種情況下我無法檢查變數的地址。
uj5u.com熱心網友回復:
Node.js 模塊系統是單例和模塊快取,模塊系統一次又一次地參考完全相同的檔案。例如:
計數器.js
let value = 0
module.exports = {
increment: () => value ,
get: () => value,
}
應用程式.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
在你的情況下,它正在以同樣的方式發生。但是,您正在更改 array 的參考gDataChange。檢查以下代碼:
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.
因此,值的變化不是因為節點,而是因為您正在更改對物件的參考。這就是 JS 物件的作業方式。即使您分配過濾器陣列值,您也是在創建新陣列。
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
}
您可以檢查節點模塊的決議方式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/398164.html
標籤:javascript 节点.js 数组 模块 javascript对象
下一篇:確定哪個表單發送POST方法
