分析:初始exports和module.exports是指向同一块内存区域,其内容都是一个空对象。
exports === module.exports // 输出是 true
(⭐⭐要领)在引入某模块时:不管代码中有没有写exports,最终都是以该模块代码中module.exports指向的内容为准,没有赋值就是{}。
结论:开发中尽量用module.exports,慎用exports.
1.假设yourModule.js的内容是exports.a = 1; 在index.js中,用使用模块const obj= require('./yourModule'); console.log(obj)。请问代码中会输出什么结果?
答案是:{ a: 1 }
解析:
(1)初始状态,exports 和module.exports指向同一个堆地址,存放的是一个空对象,如图所示:
(2)exports.a = 1,在空对象中添加一个属性为a,属性值为1的键值对,导出的结a:1}
2.假设yourModule.js的内容是exports = {a:1}; 在index.js中,用使用模块const obj= require('./yourModule'); console.log(obj)。请问代码中会输出什么结果?
答案是:{}
(1)初始状态:堆地址中存放的是空对象;
(2)exports={a:1}会重新在堆空间中开辟一个新地址a002,用来存放{a:1}这个对象,此时exports的指向由a001指向了a002,exports导出结果是{a:1},module.exports导出结果是{},当exports遇上module.exports,以module.exports的结果为准,所以最后导出的结果是{}。
3.假设yourModule.js的内容是exports.a = 1; module.exports.b = 2; 在index.js中,用使用模块const obj= require('./yourModule'); console.log(obj)。请问代码中会输出什么结果?
答案是:{ a: 1, b: 2 }
exports.a = 1,可以理解为在a001地址中向空对象添加属性为a属性值为1的键值对
module.exports.b = 2,可以理解为在a001地址中向空对象添加属性为b属性值为2的键值对
4.假设yourModule.js的内容是exports = {a:1}; module.exports={b:2}; 在index.js中,用使用模块const obj= require('./yourModule'); console.log(obj)。请问,代码中会输出什么结果?
答案是:{ b: 2 }
解析:exports = {a:1}; module.exports={b:2};会在堆中开辟两个新的地址
exports的输出结果是{a:1},module.exports的输出结果是{b:2},但最终的结果要以module.exports导出的结果为准。
5.假设yourModule.js的内容是exports = {a:1}; module.exports=2; 在index.js中,用使用模块const obj= require('./yourModule'); console.log(obj)。请问代码中会输出什么结果?
答案是:2
exports = {a:1},在堆中新开辟了一个堆地址,存{a:1}
module.exports=2,在栈中开辟了一个空间,存放数值数据2
6.假设yourModule.js的内容是exports = 1; 在index.js中,用使用模块const obj= require('./yourModule'); console.log(obj)。请问,代码中会输出什么结果?
答案是:{}
解析:以module.exports的导出结果为准
7.假设yourModule.js的内容是let a = 1; 在index.js中,用使用模块const obj= require('./yourModule'); console.log(obj)。请问,代码中会输出什么结果?
答案是:{}
解析:以module.exports的导出结果为准