1. 程式人生 > >node.js exports和module.exports的區別

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”}