Deep copy and shallow copy in Node.js

今天發生一件事,原本程式碼長這樣:

build_string.js

 var facebook = require('../es_string/fb_cmt');
 var body = facebook.body;
 ...
 body.b.append({ 'query': 'A3', 'type': 'phrase'});

其中 ../es_string/fb_cmt 內長類似這樣:

exports.body = { b: [''] };

我發現當我執行兩次 build_string.js 的後,body 輸出的結果會是:

{ b: ['', { 'query': 'A3', 'type': 'phrase'}, { 'query': 'A3', 'type': 'phrase'}]}

很奇怪重複了兩次,我判斷是第一次結束後物件被保存下來,第二次的 require 並不是重新建立一個新物件,而是改寫原本參考的物件(shallow copy),所以上網找到這篇討論 node.js 中物件拷貝方法的討論

因為我需要的是每次執行 build_string.js 產生新的物件,也就是要 deep copy 物件的記憶體,所以我選擇依照網友的答案將 var body = facebook.body 那一行改寫成 var body = JSON.parse(JSON.stringify(facebook.body));,果然重新執行 build_string.js 後每次的 body 內容就沒有重複了

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s