Javascript's by value and by reference
這篇筆記是從 Javascript30 的 Day14 - JavaScript References VS Copying 整理下來的。
記得在stackoverflow上面也有人提出其實JS沒有分所謂的
by value
和by reference
,
而是以變數的值是否immutable
的差別來區分,
不過我覺得這樣子的分法對我來說比較好理解。
1. By Value (Copying)
一般來說只要是 strings, numbers 和 booleans,都可以說是 by value
。
|
|
2. By Reference
如果是 array
或者 object
,則會以 by reference
的方式傳遞。
|
|
Array 也是一樣的道理:
|
|
要解決這個問題,就必須把Object
或Array
直接Copy一份才行。
Copying an array
12345//以下幾種方式皆可行const teamCopy1 = players.slice();const teamCopy2 = [].concat(players);const teamCopy3 = [...players]; //es6const teamCopy4 = Array.from(players);Copying an object
123const personCopy = Object.assign({}, person, {newProperty: "some additional property for personCopy"});要注意的是以上的方法是
Shallow copy
,如果 Object 本身是二維
以上的話,使用上面的方式還是會有By reference
的情況發生。1234567891011121314let me = {name: "Trina",age: 24,social: {twitter: "@tri613",github: "tri613"}};let me2 = Object.assign({}, me);me2.social.twitter = "@nomoney";console.log(me.social);//{twitter: "@nomoney", github: "tri613"} --> Changed!這種情況需要靠
Deep clone
來解決,最簡單 (但效率表現沒那麼好) 的方式 是直接使用JSON格式encode再decode的方式解決。1const meCopy = JSON.parse(JSON.stringify(me));其他的方式可以參考stackoverflow上面的這篇。