一图搞懂深拷贝与浅拷贝赋值差异,以node.js中module.exports和experts两种导出方式为例

分析:初始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的导出结果为准

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值