ค่าใน JavaScript จะเป็นประเภทใดประเภทหนึ่งเสมอ ตัวอย่างเช่น สตริงหรือตัวเลข
มีประเภทข้อมูลพื้นฐานแปดประเภทใน JavaScript เราจะพูดถึงเรื่องเหล่านี้โดยทั่วไป และในบทต่อไปเราจะพูดถึงแต่ละเรื่องโดยละเอียด
เราสามารถใส่ประเภทใดก็ได้ลงในตัวแปร ตัวอย่างเช่น ในช่วงเวลาหนึ่งตัวแปรอาจเป็นสตริงแล้วเก็บตัวเลข:
//ไม่มีข้อผิดพลาด ให้ข้อความ = "สวัสดี"; ข้อความ = 123456;
ภาษาการเขียนโปรแกรมที่อนุญาตสิ่งต่าง ๆ เช่น JavaScript เรียกว่า "ประเภทข้อมูลแบบไดนามิก" ซึ่งหมายความว่ามีประเภทข้อมูลอยู่ แต่ตัวแปรไม่ได้ผูกไว้กับประเภทข้อมูลใด ๆ
ให้ n = 123; n = 12.345;
ประเภท ตัวเลข แสดงถึงทั้งจำนวนเต็มและจำนวนจุดลอยตัว
มีการดำเนินการมากมายสำหรับตัวเลข เช่น การคูณ * การหาร / การบวก + การลบ - และอื่นๆ
นอกจากตัวเลขปกติแล้ว ยังมีสิ่งที่เรียกว่า "ค่าตัวเลขพิเศษ" ซึ่งเป็นของประเภทข้อมูลนี้ด้วย: Infinity , -Infinity และ NaN
Infinity แสดงถึงอินฟินิตี้ทางคณิตศาสตร์ ∞ เป็นค่าพิเศษที่มากกว่าจำนวนใดๆ
เราสามารถได้ผลลัพธ์จากการหารด้วยศูนย์:
การแจ้งเตือน( 1 / 0 ); //อินฟินิตี้
หรือเพียงอ้างอิงโดยตรง:
การแจ้งเตือน ( อินฟินิตี้ ); //อินฟินิตี้
NaN แสดงถึงข้อผิดพลาดในการคำนวณ เป็นผลมาจากการดำเนินการทางคณิตศาสตร์ที่ไม่ถูกต้องหรือไม่ได้กำหนดไว้ เช่น
alert( "ไม่ใช่ตัวเลข" / 2 ); // น่าน การแบ่งดังกล่าวผิดพลาด
NaN มีความเหนียว การดำเนินการทางคณิตศาสตร์เพิ่มเติมใด ๆ บน NaN จะส่งคืน NaN :
การแจ้งเตือน (น่าน + 1); // แนน การแจ้งเตือน (3 * NaN); // แนน alert( "ไม่ใช่ตัวเลข" / 2 - 1 ); // แนน
ดังนั้น หากมี NaN อยู่ที่ไหนสักแห่งในนิพจน์ทางคณิตศาสตร์ มันจะแพร่กระจายไปยังผลลัพธ์ทั้งหมด (มีข้อยกเว้นเพียงข้อเดียวเท่านั้น: NaN ** 0 คือ 1 )
การดำเนินการทางคณิตศาสตร์มีความปลอดภัย
การทำคณิตศาสตร์นั้น "ปลอดภัย" ใน JavaScript เราทำอะไรก็ได้: หารด้วยศูนย์ ถือว่าสตริงที่ไม่ใช่ตัวเลขเป็นตัวเลข ฯลฯ
สคริปต์จะไม่หยุดอยู่กับข้อผิดพลาดร้ายแรง (“ตาย”) ที่แย่ที่สุดเราจะได้ NaN ตามผลลัพธ์
ค่าตัวเลขพิเศษอย่างเป็นทางการอยู่ในประเภท "ตัวเลข" แน่นอนว่าคำนี้ไม่ใช่ตัวเลขในความหมายทั่วไป
เราจะดูเพิ่มเติมเกี่ยวกับการทำงานกับตัวเลขในบทตัวเลข
ใน JavaScript ประเภท “number” ไม่สามารถแสดงค่าจำนวนเต็มที่มากกว่า (2 53 -1) (นั่นคือ 9007199254740991 ) หรือน้อยกว่า -(2 53 -1) สำหรับค่าเชิงลบ
เพื่อให้แม่นยำยิ่งขึ้น ประเภท "ตัวเลข" สามารถเก็บจำนวนเต็มที่มีขนาดใหญ่กว่าได้ (มากถึง 1.7976931348623157 * 10 308 ) แต่อยู่นอกช่วงจำนวนเต็มที่ปลอดภัย ±(2 53 -1) จะมีข้อผิดพลาดที่แม่นยำ เนื่องจากตัวเลขบางหลักไม่พอดี ลงในที่เก็บข้อมูลคงที่ 64 บิต ดังนั้นจึงสามารถจัดเก็บค่า "โดยประมาณ" ได้
ตัวอย่างเช่น ตัวเลขสองตัวนี้ (เหนือช่วงปลอดภัย) จะเหมือนกัน:
console.log(9007199254740991 + 1); // 9007199254740992 console.log(9007199254740991 + 2); // 9007199254740992
กล่าวคือ จำนวนเต็มคี่ทั้งหมดที่มากกว่า (2 53 -1) ไม่สามารถจัดเก็บไว้ในประเภท "ตัวเลข" ได้เลย
สำหรับวัตถุประสงค์ส่วนใหญ่ ช่วง ±(2 53 -1) ก็เพียงพอแล้ว แต่บางครั้งเราต้องการช่วงจำนวนเต็มขนาดใหญ่จริงๆ เช่น สำหรับการเข้ารหัสหรือการประทับเวลาที่มีความแม่นยำระดับไมโครวินาที
เพิ่งเพิ่มประเภท BigInt ให้กับภาษาเพื่อแสดงจำนวนเต็มตามความยาวที่กำหนด
ค่า BigInt ถูกสร้างขึ้นโดยการผนวก n ต่อท้ายจำนวนเต็ม:
// ตัว "n" ต่อท้ายหมายถึง BigInt const ใหญ่Int = 1234567890123456789012345678901234567890n;
เนื่องจากไม่ค่อยจำเป็นต้องใช้หมายเลข BigInt เราจึงไม่ได้กล่าวถึงตัวเลขเหล่านี้ในที่นี้ แต่ได้ทุ่มเทให้กับบท BigInt ที่แยกต่างหาก อ่านเมื่อคุณต้องการตัวเลขจำนวนมาก
สตริงใน JavaScript จะต้องล้อมรอบด้วยเครื่องหมายคำพูด
ให้ str = "สวัสดี";
ให้ str2 = 'เครื่องหมายคำพูดเดี่ยวก็โอเคเหมือนกัน';
ให้วลี = `สามารถฝังอีก ${str}`;ใน JavaScript มีเครื่องหมายคำพูดอยู่ 3 ประเภท
เครื่องหมายคำพูดคู่: "Hello"
คำพูดเดียว: 'Hello'
แบคติค: `Hello` `
เครื่องหมายคำพูดคู่และเดี่ยวเป็นเครื่องหมายคำพูด "ธรรมดา" แทบไม่มีความแตกต่างระหว่างพวกมันใน JavaScript
Backticks คือเครื่องหมายคำพูด “ฟังก์ชันเพิ่มเติม” พวกมันอนุญาตให้เราฝังตัวแปรและนิพจน์ลงในสตริงโดยล้อมพวกมันด้วย ${…} ตัวอย่างเช่น:
ให้ชื่อ = "จอห์น";
//ฝังตัวแปร
alert( `สวัสดี ${name}!` ); // สวัสดีจอห์น!
// ฝังนิพจน์
alert( `ผลลัพธ์คือ ${1 + 2}` ); // ผลลัพธ์คือ 3 นิพจน์ภายใน ${…} ได้รับการประเมิน และผลลัพธ์จะกลายเป็นส่วนหนึ่งของสตริง เราสามารถใส่อะไรก็ได้ลงไป เช่น ตัวแปร เช่น name หรือนิพจน์ทางคณิตศาสตร์ เช่น 1 + 2 หรืออะไรที่ซับซ้อนกว่านี้
โปรดทราบว่าสามารถทำได้ใน backticks เท่านั้น คำพูดอื่นๆ ไม่มีฟังก์ชันการฝังนี้!
alert( "ผลลัพธ์คือ ${1 + 2}" ); // ผลลัพธ์คือ ${1 + 2} (เครื่องหมายคำพูดคู่ไม่ทำอะไรเลย)เราจะกล่าวถึงสตริงอย่างละเอียดมากขึ้นในบทที่ สตริง
ไม่มีประเภท อักขระ
ในบางภาษา จะมีประเภท "อักขระ" พิเศษสำหรับอักขระตัวเดียว ตัวอย่างเช่น ในภาษา C และ Java เรียกว่า "char"
ใน JavaScript ไม่มีประเภทดังกล่าว มีประเภทเดียวเท่านั้น: string สตริงอาจประกอบด้วยอักขระศูนย์ (เว้นว่าง) อักขระหนึ่งตัวหรือหลายตัว
ประเภทบูลีนมีเพียงสองค่าเท่านั้น: true และ false
ประเภทนี้มักใช้เพื่อเก็บค่าใช่/ไม่ใช่: true หมายถึง "ใช่ ถูกต้อง" และ false หมายถึง "ไม่ ไม่ถูกต้อง"
ตัวอย่างเช่น:
ให้ nameFieldChecked = true; // ใช่ ช่องชื่อถูกเลือกแล้ว ให้ ageFieldChecked = false; // ไม่ ไม่ได้ตรวจสอบช่องอายุ
ค่าบูลีนยังมาจากผลการเปรียบเทียบ:
ให้ isGreater = 4 > 1; การแจ้งเตือน ( isGreater ); // จริง (ผลการเปรียบเทียบคือ "ใช่")
เราจะกล่าวถึงบูลีนให้ลึกซึ้งยิ่งขึ้นในบทตัวดำเนินการเชิงตรรกะ
ค่า null พิเศษไม่ได้อยู่ในประเภทใดๆ ที่อธิบายไว้ข้างต้น
มันเป็นรูปแบบแยกประเภทของตัวเองซึ่งมีเพียงค่า null :
ให้อายุ = โมฆะ;
ใน JavaScript null ไม่ใช่ "การอ้างอิงถึงวัตถุที่ไม่มีอยู่" หรือ "ตัวชี้ค่าว่าง" เหมือนในภาษาอื่นๆ บางภาษา
เป็นเพียงค่าพิเศษที่แสดงถึง "ไม่มีอะไร" "ว่างเปล่า" หรือ "ไม่ทราบค่า"
รหัสด้านบนระบุว่าไม่ทราบ age
ค่าพิเศษ undefined ยังโดดเด่นอีกด้วย มันสร้างประเภทของตัวเองเหมือนกับ null
ความหมายของ undefined คือ "ไม่ได้กำหนดค่า"
หากมีการประกาศตัวแปร แต่ไม่ได้กำหนด ค่าของตัวแปรนั้นจะ undefined :
ปล่อยให้อายุ; การแจ้งเตือน(อายุ); // แสดง "ไม่ได้กำหนด"
ในทางเทคนิคแล้ว เป็นไปได้ที่จะกำหนดตัวแปร undefined อย่างชัดเจน:
ให้อายุ = 100; // เปลี่ยนค่าเป็นไม่ได้กำหนด อายุ = ไม่ได้กำหนด; การแจ้งเตือน(อายุ); // "ไม่ได้กำหนด"
…แต่เราไม่แนะนำให้ทำเช่นนั้น โดยปกติแล้ว เราจะใช้ null เพื่อกำหนดค่า “ว่าง” หรือ “ไม่ทราบ” ให้กับตัวแปร ในขณะ undefined จะถูกสงวนไว้เป็นค่าเริ่มต้นสำหรับสิ่งที่ไม่ได้กำหนด
ประเภท object เป็นแบบพิเศษ
ประเภทอื่นๆ ทั้งหมดเรียกว่า "ดั้งเดิม" เนื่องจากค่าของพวกมันสามารถมีเพียงสิ่งเดียวเท่านั้น (ไม่ว่าจะเป็นสตริง ตัวเลข หรืออะไรก็ตาม) ในทางตรงกันข้าม ออบเจ็กต์ถูกใช้เพื่อจัดเก็บข้อมูลและเอนทิตีที่ซับซ้อนมากขึ้น
เนื่องจากวัตถุมีความสำคัญจึงสมควรได้รับการดูแลเป็นพิเศษ เราจะมาพูดถึงพวกมันในบท Objects หลังจากที่เราเรียนรู้เพิ่มเติมเกี่ยวกับ primitives แล้ว
ประเภท symbol ใช้เพื่อสร้างตัวระบุเฉพาะสำหรับออบเจ็กต์ เราต้องกล่าวถึงที่นี่เพื่อความสมบูรณ์ แต่ยังเลื่อนรายละเอียดออกไปจนกว่าเราจะรู้วัตถุ
ตัวดำเนินการ typeof ส่งกลับประเภทของตัวถูกดำเนินการ มีประโยชน์เมื่อเราต้องการประมวลผลค่าประเภทต่างๆ ที่แตกต่างกันหรือเพียงต้องการตรวจสอบอย่างรวดเร็ว
การเรียก typeof x ส่งคืนสตริงที่มีชื่อประเภท:
typeof ไม่ได้กำหนด // "ไม่ได้กำหนด"
ประเภท 0 // "หมายเลข"
ประเภท 10n // "bigint"
ประเภทจริง // "บูลีน"
ประเภท "foo" // "string"
ประเภทของสัญลักษณ์("id") // "สัญลักษณ์"
ประเภทของคณิตศาสตร์ // "วัตถุ" (1)
typeof null // "วัตถุ" (2)
ประเภทของการแจ้งเตือน // "ฟังก์ชั่น" (3)สามบรรทัดสุดท้ายอาจต้องมีคำอธิบายเพิ่มเติม:
Math เป็นวัตถุในตัวที่ให้การดำเนินการทางคณิตศาสตร์ เราจะเรียนรู้มันในบทตัวเลข ที่นี่ทำหน้าที่เป็นเพียงตัวอย่างของวัตถุ
ผลลัพธ์ของ typeof null คือ "object" นั่นเป็นข้อผิดพลาดที่ได้รับการยอมรับอย่างเป็นทางการใน typeof ซึ่งมาจาก JavaScript ยุคแรก ๆ และเก็บไว้เพื่อความเข้ากันได้ แน่นอน null ไม่ใช่วัตถุ เป็นค่าพิเศษที่มีชนิดแยกออกมาด้วยตัวมันเอง พฤติกรรมของ typeof ผิดที่นี่
ผลลัพธ์ของ typeof alert คือ "function" เนื่องจาก alert เป็นฟังก์ชัน เราจะศึกษาฟังก์ชันในบทถัดไป ซึ่งเราจะเห็นว่าไม่มีประเภท "ฟังก์ชัน" พิเศษใน JavaScript ฟังก์ชั่นเป็นของประเภทวัตถุ แต่ typeof ปฏิบัติต่อพวกเขาแตกต่างกันโดยส่งคืน "function" นั่นมาจากยุคแรก ๆ ของ JavaScript ในทางเทคนิคแล้ว พฤติกรรมดังกล่าวไม่ถูกต้อง แต่สามารถทำได้สะดวกในทางปฏิบัติ
ไวยากรณ์ typeof(x)
คุณอาจเจอไวยากรณ์อื่น: typeof(x) มันเหมือนกับ typeof x
เพื่อให้ชัดเจน: typeof เป็นตัวดำเนินการ ไม่ใช่ฟังก์ชัน วงเล็บในที่นี้ไม่ได้เป็นส่วนหนึ่งของ typeof เป็นวงเล็บแบบที่ใช้จัดกลุ่มทางคณิตศาสตร์
โดยปกติแล้ว วงเล็บดังกล่าวจะมีนิพจน์ทางคณิตศาสตร์ เช่น (2 + 2) แต่ที่นี่มีเพียงอาร์กิวเมนต์เดียวเท่านั้น (x) ในทางวากยสัมพันธ์ พวกเขาอนุญาตให้หลีกเลี่ยงช่องว่างระหว่างตัวดำเนินการ typeof และอาร์กิวเมนต์ของมัน และบางคนก็ชอบมัน
บางคนชอบ typeof(x) แม้ว่าไวยากรณ์ของ typeof x จะพบได้บ่อยกว่ามากก็ตาม
ข้อมูลพื้นฐานใน JavaScript มี 8 ประเภท
ประเภทข้อมูลดั้งเดิมเจ็ดประเภท:
number สำหรับตัวเลขชนิดใดๆ: จำนวนเต็มหรือจุดลอยตัว จำนวนเต็มจะถูกจำกัดโดย ±(2 53 -1)
bigint สำหรับจำนวนเต็มความยาวใดก็ได้
string สำหรับสตริง สตริงอาจมีอักขระตั้งแต่ศูนย์ขึ้นไป ไม่มีประเภทอักขระเดี่ยวแยกกัน
boolean สำหรับ true / false
null สำหรับค่าที่ไม่รู้จัก – ประเภทสแตนด์อโลนที่มีค่าเดียว null
undefined สำหรับค่าที่ไม่ได้กำหนด – ประเภทสแตนด์อโลนที่มีค่าเดียว undefined
symbol สำหรับตัวระบุที่ไม่ซ้ำ
และประเภทข้อมูลที่ไม่ใช่แบบดั้งเดิมหนึ่งประเภท:
object สำหรับโครงสร้างข้อมูลที่ซับซ้อนมากขึ้น
ตัวดำเนินการ typeof ช่วยให้เราเห็นว่าประเภทใดถูกเก็บไว้ในตัวแปร
โดยปกติจะใช้เป็น typeof x แต่สามารถใช้ typeof(x) ได้เช่นกัน
ส่งกลับสตริงที่มีชื่อประเภท เช่น "string"
สำหรับการส่งคืน "object" เป็น null นี่เป็นข้อผิดพลาดในภาษา ซึ่งจริงๆ แล้วไม่ใช่วัตถุ
ในบทถัดไป เราจะเน้นไปที่ค่าดั้งเดิม และเมื่อเราคุ้นเคยกับค่าเหล่านั้นแล้ว เราจะไปยังเรื่องวัตถุ
ความสำคัญ: 5
ผลลัพธ์ของสคริปต์คืออะไร?
ให้ชื่อ = "อิลยา";
alert( `สวัสดี ${1}` ); -
alert( `สวัสดี ${"name"}` ); -
alert( `สวัสดี ${name}` ); -
Backticks ฝังนิพจน์ภายใน ${...} ลงในสตริง
ให้ชื่อ = "อิลยา";
// นิพจน์คือหมายเลข 1
alert( `สวัสดี ${1}` ); // สวัสดี 1
// นิพจน์คือสตริง "ชื่อ"
alert( `สวัสดี ${"name"}` ); //สวัสดีชื่อ
// นิพจน์เป็นตัวแปร ให้ฝังไว้
alert( `สวัสดี ${name}` ); //สวัสดีอิลยา