不管是JS還是其他語言,都是重要的程式語言概念!

Primitive Data Types:

先用Primitive Data Types做實驗:

let num1 = 100;
let num2 = num1;

num1 = 50;

console.log(num1, num2); // 50 100

▲num2 並沒有因為 num1 value改變了就跟著改變,證明了 num2 確實擁有 100 這個 value

Reference Data Type:

這次換成用Reference Data Type 做實驗:

let num1 = [100];
let num2 = num1;

num1.push(200);

console.log(num1, num2); // [ 100, 200 ] [ 100, 200 ]

▲照理來講num2沒有被push新元素,這是因為num2被賦值跟num1一樣後,系統將儲存num1記憶體位址的地址也給了num2,因此num2擁有的不是value,而是他reference num1的記憶體地址;該地址被push了新東西以後,參照此位址的num1 跟 num2 自然就都會參照到此地址新的狀況。

<aside> 💡 Primitive Data Types 賦值的差異在於,在num2 被賦值成 num1 時,記憶體是有新開一個地址給num2,並且存進跟num1的value一樣的值,因此就算num1值變了,已經是存在新地址的num2的value自然不會有影響。我們故可以形容說他是真的"擁有"該value,而非像Reference Data Type只是被reference到一樣的地址。

</aside>

※這個觀念很重要,若是不懂會造成code出現很多bug!

有關Primitive Data Types的Property & Meyhods

前述Primitive Data Types means they are not "objects", and they don't have its own properties and methods. 就表明了 Primitive Data Types 不具有屬性和方法,那為何我們還是可以看到例如 string.length 屬性 或 string.toUpperCase() 方法 被使用?