node.js exports和module.exports的区别

要首先了解值类型以及引用类型

(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

所以出口和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”}

猜你喜欢

转载自blog.csdn.net/qq_32648375/article/details/83240220