iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0
自我挑戰組

Be friend with JavaScript系列 第 17

Day 17 - Primitive and Reference

Primitive Data Types

變數擁有值,當某個變數的值賦予給其他變數時,是採用複製的方法,所以就算之後改變了值,也互不影響。
Primitive Data Types 不是物件,沒有自己的 properties 和 methods ,且她們的變數擁有自己的值(value),而不是在記憶體中的參考(Reference)。
例如:

let number1 = 100;
let number2 = number1;
console.log(number1,number2); // 100,100
number1 = 50;
console.log(number1,number2); // 50,100

因為數字是 Primitive Data Type ,將 number1 這個變數丟進 number2 的時候,就變成 number2 的值,而之後如果 number1 改變值,也不會影響到 Number2 。

Reference Data Types

沒有值在資料裡面,只是指向 object 在電腦的記憶體位置而已
物件和陣列都是 Reference data type ,他們的變數沒有自己的 value ,而是在電腦的記憶體位置裡面給 value 一個參考(Reference)。
例如:

let friends1 = ["Mike","Bob","Harry"];
let friends2 = friends1;
console.log(friends2); // ["Mike","Bob","Harry"]
friends1.push("Tom");
console.log(friends1); // ["Mike","Bob","Harry","Tom"]
console.log(friends2); ["Mike","Bob","Harry","Tom"]

電腦把 friends1 的 array 放在某個記憶體位置,把 friends1 的值丟進 friends2 的時候, friends2 也裝著 friends1 的記憶體位置,所以當 friends1 的東西改變時,會從 friends1 的地址去改變內容, friends2 也就從 friends1 的位置得到改變後的內容,所以最終 friends1 和 friends2 的資料室一模一樣的,而不論是 friends1 或是 friends2 這個變數,他們都只是記憶體位置的參考而已。


補充:

Primitive Coercion

前面說過 Primitive Data Types 沒有自己的 properties 和 methods ,這邊我們就來探討為什麼像是 string 還有自己的 properties (ex: length)和 methods (ex: toLowerCase()) 呢?

是因為在 JavaScript 裡有一種 property 叫 Coercion ,他會強迫把 Primitive Data Type 改成一個 object 來使用 property 和 method,達成目的後又馬上變回原本的狀態,這種做法是對記憶體比較有效率的做法。
例如:

let name = "Justin";
console.log(name.toLowerCase()); // justin
console.log(typeof name); // string

name 在執行 toLowerCase() 的瞬間會被改成 object ,執行完後又瞬間變回 string 。

雖然可以使用 object 的語法來製作一個 string ,但這種做法還要再額外分配記憶體給這個 string ,所以不推薦這種做法,如下

let name = new String("Justin");
console.log(name); // String{"Justin"}
console.log(typeof name); // object

用這種做法變成 object 後,就會有非常多種 properties 和 methods ,對電腦的記憶體產生其他負擔。

使用 Coercion 的話,因為執行完會馬上恢復 primitive Data Type,這種做法還是最好的。


上一篇
Day 16 - Array Methods
下一篇
Day 18 - for in & for of loop
系列文
Be friend with JavaScript39
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言