「pass by value、pass by reference、深拷貝」相關筆記

總結

對 Primitive types 與 Structural types 的資料使用等號進行「賦值」的動作時,賦予的內容分別是值本身(value)或記憶體中的位置(reference):

Pass by value

Pass by reference

深拷貝(deep copy)

概念如下:透過對container1進行深拷貝來取得container2的話 ⋯⋯

JSON.stringify搭配JSON.parse

把需要進行深拷貝的目標傳入JSON.stringify,再將JSON.stringify回傳的 JSON string 傳入JSON.parse()重建為 JavaScript 物件(或值)

const container1 = {apple: 6}
const jsonString = JSON.stringify(container1) // 取得JSON string化的container1
const container2 = JSON.parse(jsonString)     // 將JSON string化的container1重建為JavaScript物件,得到與container1無關的container2
container1.apple = 3
console.log(container2) // output: {apple: 6}

JSON.stringify的特性:

JSON.parse的使用注意事項:

使用Lodash_.cloneDeep

文件:https://docs-lodash.com/v4/clone-deep/

const container1 = [{ apple: 6 }, { orange: 2 }]
const container2 = _.cloneDeep(container1)

container1[0].apple = 3
console.log(container1) // [{ apple: 3 }, { orange: 2 }]
console.log(container2) // [{ apple: 6 }, { orange: 2 }]

使用jQuery$.extend

文件:https://api.jquery.com/jquery.extend/

const container1 = [{ apple: 6 }, { orange: 2 }]
const container2 = $.extend(true, [], container1);

container1[0].apple = 3
console.log(container1) // [{ apple: 3 }, { orange: 2 }]
console.log(container2) // [{ apple: 6 }, { orange: 2 }]

Node.js: Serialization API

文件:https://nodejs.org/api/all.html#v8_serialization_api

const v8 = require('v8')

const structuredClone = obj => {
  return v8.deserialize(v8.serialize(obj));
}

The structured clone algorithm

參考:https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm 尚未於瀏覽器中實現。

bonus track: CPython id() in JavaScript?

提問:CPython 的id()會回傳物件在記憶體中的位置,JavaScript 有類似的功能嗎? 簡答:沒有。 詳答:

參考文件