當建立變數並給值時
var a = 3;
var b;
b = a;
接下來會發生什麼事?
你可以猜到 a會是3,b也是3
他們是對方的拷貝,在兩個不同的記憶體位置
這表示說,我可以改變a的值而不影響b
因為他們是記憶體中不同的兩點
那如果再把2給a呢?
var a = 3;
var b;
b = a;
a = 2;
console.log(a) //2
console.log(b) //3
a是2,b就是3,因為b只是a的拷貝,他有自己的記憶體位置,所以當我再次改變a,他不會對b有人任何影響,這就是 by value
var x = { content: '可以吃飯囉!' };
var y;
x = y;
console.log()
等號運算子知道他x是物件,所以不會建立一個新的記憶體位址給y,而是把y指向何x相同的記憶體位址,所以x和y是一樣的值,但他們不是對方值的拷貝,只是指向同一個記憶體位址
那如果這時候改變屬性的值呢?
y.content = '我吃飽了!'
console.log(x);
console.log(y);
x和y分別是什麼呢?
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
console.log(x); //Object {content:'我吃飽了!'}
console.log(y); //Object {content:'我吃飽了!'}
前面有說過~他們都指向同一個記憶體,所以改變了該物件的值,用了什麼名稱不重要,他們只是別名而已
由於物件指向同一個位址,一旦改變了其中一個,另一個也會跟著改變
如果使用函式的參數時也一樣,盡管式參數,物件也會經由參考(by reference)被傳入
今日重點:
純值是by value
物件是by reference
如果不懂這些觀念,會導致一些問題
一些很難debug的問題,只要弄清楚就簡單多了
參考:udemy-克服JS的奇怪部分