Open Twlig opened 2 years ago
module.exports和exports其实指向的是同一个对象module.exports == exports //true但是在使用上存在一些不同。
module.exports == exports //true
通过exports只能使用.的方式来向外暴露内部变量
.
exports.xxx=xxx
而module.exports既可以通过.的形式,也可以直接赋值
module.exports.xxx=xxx
module.exports = {}
module.exports = { Name: ‘zzy’, Age: 22, Say: function(name, age) {} }
exports.name = ’zzy‘; exports.age = 22; exports.Say = function(name, age){};
而如果对exports也采用exports = {},则在引入模块后,调用Name等属性会发现是undefined
exports = {}
Name
undefined
exports = { Name: ‘zzy’, Age: 22, Say: function(name, age) {} }
这就涉及到了原始值和引用值的不同
原始值
JS中基本数据类型:Null,Undefined,Boolean,Number,String,Symbol都是原始值,保存原始值是按值保存。即,在栈中开辟出空间,用来存放变量名以及其对应的变量值。
Null,Undefined,Boolean,Number,String,Symbol
var a = 10; var b = a; a++;
因此a++不会影响到b
a++
b
引用值
引用值是指Object对象类型,该类型在存储的时候是在栈中存储变量名以及对应的堆地址空间
Object
var module= new Object(); module.exports = {}; //0x1234 var exports = module.exports; //0x1234 exports.name = “zzy”; //0x1234 //因为exports是对象,修改数据是在堆内存直接操作的,因此向exports变量添加name属性,也会指向的module堆内存。
var module= new Object(); module.exports = {}; //0x1234 var exports = module.exports; //0x1234 exports = {name: “zzy”,age:22}; //0x3456
exports会新建一个对象指向另一个堆内存空间,相当于切断了和module的联系。而node模块在导入的时候是采用module,所以在导入之后是去module.exports中找导出的变量和函数,也就是0x1234空间。使用exports={...}修改的是0x3456就无法成功导出。
module.exports和exports的区别
module.exports和exports其实指向的是同一个对象
module.exports == exports //true
但是在使用上存在一些不同。通过exports只能使用
.
的方式来向外暴露内部变量exports.xxx=xxx
而module.exports既可以通过
.
的形式,也可以直接赋值module.exports.xxx=xxx
module.exports = {}
案例
而如果对exports也采用
exports = {}
,则在引入模块后,调用Name
等属性会发现是undefined
这就涉及到了原始值和引用值的不同
原始值和引用值
原始值
JS中基本数据类型:
Null,Undefined,Boolean,Number,String,Symbol
都是原始值,保存原始值是按值保存。即,在栈中开辟出空间,用来存放变量名以及其对应的变量值。因此
a++
不会影响到b
引用值
引用值是指
Object
对象类型,该类型在存储的时候是在栈中存储变量名以及对应的堆地址空间 exports会新建一个对象指向另一个堆内存空间,相当于切断了和module的联系。而node模块在导入的时候是采用module,所以在导入之后是去module.exports中找导出的变量和函数,也就是0x1234空间。使用exports={...}修改的是0x3456就无法成功导出。