要首先了解值类型以及引用类型
(1)值类型:字符串(字符串),数值(数),布尔值(布尔值),无,未定义
(2)引用类型:对象(对象),数组(阵列),函数(功能)
值类型数据存储在栈上,而引用类型数据存储在堆上(此图只为解释堆栈,与下文的代码中变量无关系)
值类型:
let a=10
let b=a
console.log(b) //10
引用类型:
let obj1 = {}
let obj2 = obj1
obj2.name = xx
console.log(obj1) // name = xx
用点语法给对象添加属性的时候,OBJ1和OBJ2指针指向同一地址,所以OBJ1也有了属性名= XX
但是如果用赋值的方法给对象添加属性时,指针指向会发生改变,此时obj2指针指向了新地址例如:
let obj1 = {}
let obj2 = obj1
obj1.name = "xx"
obj2 = {name:"yy"}
console.log(obj1) //name:xx
console.log(obj2) //name:yy
所以exports和module.exports的区别如下:
默认情况下exports = module.exports
(1)exports
exports 只能通过“。语法”来向外部暴露内部变量,如exports.xxx = yyy
// 01.js中创建
exports.name = "xxx";
exports.fn = () => {
console.log("aaa")
}
exports.obj = {
name:"aa",
age:18
}
// 02.js中引入
let a = require("./01")
console.log(a);
输出结果为{ name: 'xxx', fn: [Function], obj: { name: 'aa', age: 18 } }
但是不能通过直接赋值对象,此时会返回空对象
// 01.js中创建
exports = {
name : "xxx",
fn: () => {
console.log("aaa")
},
obj: {
name:"aa",
age:18
}
}
// 02.js中引入
let a = require("./01")
console.log(a);
输出结果为{}空对象
(2)module.exports
module.exports则可以用“。语法”和赋值对象两种方法来实现module.exports.xx =“yy”或者module.exports = {xx =“yy”}