รู้จักกับตัวแปรแบบ Primitive และ Reference Type ใน JavaScript ตอนที่ 2

จากที่เขียนบทความเกี่ยวกับ Primitive Type และ Reference Type ใน JavaScript ไปในตอนที่แล้วก็ยังมีประเด็นอีกเล็กน้อยที่อาจยังไม่ได้พูดถึงเลยเพิ่งมาเขียนเพราะขี้เกียจ ^_^

ใน primitive type ก็มีบ้างครั้งที่มันจะแปลงร่างกลายเป็น Object โดยที่เราไม่รู้ตัว ซึ่งโดยปกติแล้วมันจะไม่ทำอย่างนั้น ต้องบอกก่อนว่าการที่เราประกาศตัวแปรชนิดที่เป็นตัวเลขเราสามารถประกาศเป็น Object ได้ด้วยคำสั่ง

1
var num = 10;

หรือ

1
var num = new Number(10);

ซึ่งสองคำสั่งนี้ให้ผลลัพธ์เหมือนกันคือ  10 แต่เป็น 10 คนละแบบอย่าเพิ่งรีบงง สิ่งที่แตกต่างกันคือแบบแรกจะเป็น 10 ที่เป็น Primitive Type ของ JavaScript เราจะไม่สามารกำหนด property ให้กับมันได้เช่น เราจะสั่ง

1
num.prop = 'test';

แบบนี้ไม่ได้ แต่ถ้าเราประกาศตัวแปรแบบที่สองคือใช้ new Number() คำว่า number ต้องเป็น N ใหญ่ด้วยนะอย่าลืม ซึ่งการประกาศตัวแปรแบบนี้มันจะมี type เป็น Object เราสามารถทดสอบได้ว่าตัวแปรที่เราได้มานั้นเป็น number ที่เป็น Primitive Type หรือว่า เป็น Object ที่เป็น Reference Type โดยการใช้คำสั่ง

1
typeof(num)

เราอาจทำการ log ดูโดยใช้คำสั่ง console.log ก็ได้ จะทำให้เรารู้ว่าชนิดของ num นั้นเป็นอะไรกันแน่ ซึ่งถ้าเป็น Object เราจะสามารถกำหนด property อะไรให้มันก็ได้ เพราะฉะนั้นเราจะสั่ง num.prop = ‘test’ ได้หรือเพิ่ม method ที่ทำงานเฉพาะกับตัวเลขนี้ก็ได้ แต่คงไม่มีใครทำเพราะมันดูไม่ค่อยมีประโยชน์เท่าไหร่แต่ที่พยายามเขียนขึ้นมาเพราะว่าเราจะได้เข้าใจว่าการที่เราสั่ง

1
"IRobust".length

ตัวแปร JavaScript จะทำการแปลง “IRobust” ที่เป็น string แบบ primitive type ไปเป็น Object ที่เป็น Reference Type ตอน run-time หลังจากนั้นก็จะแปลงกลับมาเป็น string ที่เป็น Primitive Type ตามเดิม

 

 

รู้จักกับตัวแปรแบบ Primitive และ Reference type ใน JavaScript

ตัวแปรใน JavaScirpt จะถูกแบ่งออกเป็น 2 ประเภทใหญ่ๆคือ primitive type และ reference type ซึ่งในแต่ละประเภทจะมีความแตกต่างกันที่ต้องทำความเข้าใจอยู่พอสมควรถึงแม้ว่าใน JavaScript เราจะไม่ต้องทำการระบุ data type ก็ตาม

Primitive Type ถ้าแปลตามความหมายคือตัวแปรที่เป็นพื้นฐานซึ่งจะประกอบไปด้วย

  1. Number    -> ข้อมูลที่เป็นตัวเลขทั้งหมด
  2. String      -> ข้อมูลที่เป็นข้อความ รวมทั้ง ‘1234’
  3. Boolean   -> ข้อมูลที่เป็น true หรือ false
  4. undefined -> ถ้าเราประกาศตัวแปรขึ้นมาโดยที่ยังไม่ได้กำหนดค่าจะเป็นข้อมูลชนิดนี้
  5. null          -> เป็นประเภทของข้อมูลที่ยังไม่แน่ใจว่าจะมีหรือไม่มี

ซึ่งลักษณะของ primitive type จะเป็นข้อมูลพื้นฐาน พูดง่ายๆก็คือข้อมูลใน JavaScript ถ้าไม่เป็น ข้อมูลที่เป็น primitive type ก็จะเป็นข้อมูลที่เกิดจากข้อมูลที่เป็น primitive type นี้ผสมกัน

Reference Type เป็นประเภทของข้อมูลที่เกิดจากการผสมกันของ primitive type ซึ่งจะประกอบไปด้วย

  1. Object
  2. Array
  3. Function
  4. Date
  5. RegExp

ข้อมูลประเภทที่เป็น reference จะเป็นข้อมูลที่แตกต่างออกไปจากข้อมูลประเภท primitive ซึ่งการใช้งาน reference type จะต้องทำการ instantiate ด้วย คำสั่ง new ทั้งหมดยกเว้น function และ Array ซึ่งจริงๆแล้ว Array ก็ต้องทำการ new เหมือนกันแต่สามารถเขียนสั้นๆได้เป็น

1
var arr = [];

หรือ

1
var arr = Array;

แต่สุดท้ายจะต้องถูกแปลงเป็น

1
var arr = new Array();

ดังนั้นจะมีเฉพาะ function ตัวเดียวเท่านั้นที่แตกต่างจากชาวบ้านเค้า เพราะ ภาษา JavaScript เป็น context switching คือการเปลี่ยน context ไปมา ซึ่งการ instantiate หรือการใช้คำสั่ง new จะไม่ได้ทำการจองพื้นที่ในหน่วยความจำและสร้าง reference เหมือนกับภาษาอื่น แต่จะเป็นการสร้าง reference ไปยัง function ที่เป็น context ตัวนึงเหมือนกัน ดังนั้นจึงสรุปว่า function เป็น context อยู่แล้วเลยไม่ต้อง new