JavaScript模块导出对象:导入时获取引用还是深拷贝?
模块导出对象后,导入得到的是引用还是深拷贝?
当你通过module.exports导出对象obj时,其他模块导入后拿到的是原对象的引用,不是深拷贝。
Node.js的CommonJS模块系统里,导出的是值的引用。导入的变量和原模块里的obj指向内存中同一个对象实例。
举个实际例子就能看明白:
- 导出模块(比如叫
objModule.js):
const obj = {A: 2} module.exports = obj
- 导入模块:
const importedObj = require('./objModule.js'); // 修改导入对象的属性 importedObj.A = 3;
这时候返回objModule.js查看obj.A,会发现它的值已经变成了3——这就说明两个变量指向的是同一个对象,并不是各自独立的拷贝。
要是你想让导入的模块拿到一个和原对象完全独立的深拷贝,得自己手动处理,比如用JSON.parse(JSON.stringify(obj))这种方式导出拷贝后的对象,或者写递归克隆函数来实现深拷贝。
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

