У меня есть
// file cars.js
var bodyshop = require('./bodyshop')
var connections = [];
many functions which operate on connections. adding them, changing them etc.
code in this file includes things like
bodyshop.meld(blah)
bodyshop.mix(blah)
exports.connections = connections
а потом
// file bodyshop.js
let cars = require('./cars');
even more functions which operate on connections. adding them, changing them etc.
code in this file includes things like
cars.connections[3].color = pink
cars.connections.splice(deleteMe, 1)
module.exports = { meld, mix, flatten }
Действительно ли код в кузовном цехе, такой как cars.connections.splice(deleteMe, 1)
, действительно удалит элемент из «этих» соединений (т. е. единственных соединений, объявленных в cars.js), а код в кузовном цехе, такой как cars.connections[3].color = pink
, действительно изменит цвет индекса 3 "самостоятельных" одно-единственных подключений?
Вполне нормально/безопасно/приемлемо, что я использовал синтаксис «module.exports = {}» в конце bodyshop, а не три строки, такие как «exports.meld = meld»?
Действительно ли это предложение полностью правильно?? «В Node.js, если вы экспортируете массив из M, при использовании массива в другом модуле X, для которого требуется M, массив будет по ссылке в X, то есть не по копии»…?
@kgangadhar - я действительно понимаю этот ценный комментарий, однако в этом вопросе я буквально задаю вопрос ... вы можете рассматривать пример кода просто как пример. ваше здоровье!
Массивы всегда передаются по ссылке в Javascript, в том числе и при экспорте. Таким образом, любой метод массива, который мутирует существующий массив, такой как .splice()
, повлияет на всех, кто использует этот массив. Методы массива, которые не изменяют массив, такие как .filter()
или .concat()
, создают новые массивы, поэтому они не влияют на исходный.
Я создал два файла со следующими методами и массивом, как вы упомянули.
Первый файл: test1.js
const testArray = [];
const getArray = () => {
return testArray;
};
module.exports = {
testArray,
getArray
}
Второй файл: test2.js
const { testArray, getArray } = require('./test1');
console.info('testing the required array before modifying it');
console.info(getArray());
testArray.push('test');
console.info('testing the method result after modifying the required array content');
console.info(getArray());
Если вы сможете создать упомянутые файлы и запустить их локально, вы увидите следующий результат.
>node test2.js
testing the required array before modifying it
[]
testing the method result after modifying the required array content
[ 'test' ]
Наблюдаемые точки:
module.exports = { }
, это не большая проблема.require
будет ссылкой, а не копией.Одним из возможных решений будет создание его копии JSON, пока requiring
, как показано ниже:
const { testArray, getArray } = require('./test1');
const testArrayCopy = JSON.parse(JSON.stringify(testArray));
console.info('testing the required array before modifying it');
console.info(getArray());
testArrayCopy.push('test');
console.info('testing the method result after modifying the required array content');
console.info(getArray());
Вот результат:
>node test2.js
testing the required array before modifying it
[]
testing the method result after modifying the required array content
[]
Примечание. Копия JSON не поможет вам правильно проанализировать DateTime.
Я считаю, что это плохой способ реализации, если вы объявляете глобальный массив и модифицируете его многими методами и экспортируете его таким образом. Я бы предпочел создать метод и экспортировать его, пусть этот метод связывает другие методы для изменения, и, наконец, вы можете вернуть преобразованный массив.