Twlig / issuesBlog

MIT License
3 stars 0 forks source link

模块导出module.exports和exports的区别 #5

Open Twlig opened 2 years ago

Twlig commented 2 years ago

module.exports和exports的区别

module.exports和exports其实指向的是同一个对象module.exports == exports //true但是在使用上存在一些不同。

案例

  1. module.exports暴露变量
module.exports = {
Name: ‘zzy’,
Age: 22,
Say: function(name, age) {}
}
  1. exports暴露变量
exports.name = ’zzy‘;
exports.age = 22;
exports.Say = function(name, age){};

而如果对exports也采用exports = {},则在引入模块后,调用Name等属性会发现是undefined

exports = {
Name: ‘zzy’,
Age: 22,
Say: function(name, age) {}
}

这就涉及到了原始值和引用值的不同

原始值和引用值

  1. 原始值

    ​ JS中基本数据类型:Null,Undefined,Boolean,Number,String,Symbol都是原始值,保存原始值是按值保存。即,在栈中开辟出空间,用来存放变量名以及其对应的变量值

    var a = 10;
    var b = a;
    a++;

    因此a++不会影响到b

  2. 引用值

    引用值是指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就无法成功导出。