Fundamentals
Expressions vs Statements
แยกแยะ expression ที่ให้ค่าออกจาก statement ที่เป็นคำสั่ง พร้อมทำนายว่าโค้ดแต่ละบรรทัดให้ค่าอะไร ผ่านโจทย์ที่ไล่ระดับ
1) ปัญหา: เก็บข้อความที่พิมพ์แล้วไม่ได้ตามที่คิด
ผู้เริ่มต้นมักเข้าใจว่า `console.log("สวัสดี")` คือการส่งข้อความออกไป แล้วตัวข้อความนั้นจะถูกเก็บไว้ให้ใช้ต่อได้ พอเขียนโค้ดแบบนั้นจริง ผลลัพธ์ที่เก็บได้กลับเป็น `undefined` ไม่ใช่ข้อความที่พิมพ์ออกไป
ข้อความ "สวัสดี" ถูกพิมพ์จริง แต่ค่าที่เก็บใส่ตัวแปรกลับเป็น undefined
ทายก่อน: `console.log("สวัสดี")` ให้ค่าอะไรกลับมา และถ้าเก็บใส่ตัวแปรจะได้อะไร?
2) สองบทบาทของโค้ด: ให้ค่ากับสั่งทำ
โค้ด JavaScript หนึ่งบรรทัดมีบทบาทได้สองแบบ: - Expression — โค้ดที่ประเมินแล้วได้ค่าหนึ่งออกมา ถามว่า "มันเท่ากับอะไร" แล้วตอบได้เสมอ - Statement — คำสั่งที่ทำอะไรบางอย่าง เช่น ประกาศตัวแปรหรือเปลี่ยนค่า ไม่ได้มีไว้ตอบว่ามีค่าเท่าไร การรู้ว่าตอนนี้ JavaScript ต้องการ "ค่า" หรือ "คำสั่ง" คือกุญแจสำคัญ เพราะวางผิดบทบาทเมื่อไร โปรแกรมจะไม่ยอมรัน
3) Expression — โค้ดที่ตอบได้ว่ามีค่าเท่าไร
Expression ทุกตัวมีค่าประจำตัวเสมอ เราจึงเก็บค่านั้นใส่ตัวแปร ส่งเข้าไปในที่อื่น หรือนำไปคำนวณต่อได้
| แบบ | ตัวอย่าง | ค่าที่ได้ |
|---|---|---|
| ค่าตรงตัว | 42, "สวัสดี", true | ค่าตัวนั้นเอง |
| ตัวแปร | price | ค่าที่ตัวแปรเก็บอยู่ |
| คำนวณ | 5 + 3 | 8 |
| ต่อข้อความ | "ราคา " + 65 | "ราคา 65" |
| เรียกใช้ | console.log("สวัสดี") | undefined |
| กำหนดค่า | score = 20 | 20 (ค่าใหม่ที่กำหนด) |
4) Statement — คำสั่งที่ทำงาน
Statement ไม่ได้มีไว้ตอบว่ามีค่าเท่าไร แต่มีไว้สั่งให้ JavaScript ทำอะไรบางอย่าง เช่น สร้างชื่อใหม่ เปลี่ยนค่าของชื่อเดิม หรือแสดงผลออกทาง console เมื่ออ่านโค้ด ให้แยกให้ออกว่า บรรทัดนี้กำลัง "ประกาศ" "เปลี่ยนค่า" หรือ "เรียกใช้งาน"
| แบบ | ตัวอย่าง | หน้าที่ |
|---|---|---|
| ประกาศตัวแปร | let price = 100; | สร้างชื่อ price พร้อมค่าเริ่มต้น |
| กำหนดค่าใหม่ | price = 65; | เปลี่ยนค่าของชื่อที่มีอยู่แล้ว |
| เรียกใช้เพื่อแสดงผล | console.log("สวัสดี"); | สั่งให้พิมพ์โดยไม่เก็บค่าที่ได้ |
5) Expression statement — จุดที่บทบาททับซ้อน
Expression บางตัวถูกนำมาใช้เป็น statement ได้ เมื่อวางไว้บรรทัดเดียวโดยไม่เก็บค่าที่ได้ เรียกว่า expression statement ตัวอย่างที่พบบ่อยที่สุดคือการเรียก `console.log()` — ตัวมันเป็น expression ที่ให้ค่า `undefined` แต่เราใช้เป็นคำสั่งเพื่อให้เกิดผลข้างเคียงคือการพิมพ์ข้อความ
บรรทัดแรกใช้ expression เป็นคำสั่ง ส่วนอีกสองบรรทัดเป็น statement ที่ประกาศและเปลี่ยนค่า
6) วางบทบาทให้ถูกที่
ทายก่อน: จากสองแบบนี้ แบบไหนรันได้ และแบบไหนทำให้โปรแกรมหยุดตั้งแต่ยังไม่ทันทำงาน?
ประกาศตัวแปรซ้อนในที่ที่ต้องการค่า
JavaScript อ่านว่าในวงเล็บต้องเป็นค่าที่คำนวณได้ แต่เจอคำสั่งประกาศตัวแปร จึงหยุดด้วย SyntaxError
บรรทัดประกาศทำงานก่อน จากนั้นจึงส่งชื่อ score ซึ่งเป็น expression เข้าไปใน console.log()
สามคำถามก่อนวางโค้ด
บรรทัดนี้ต้องให้ค่ากับที่อื่นไหม
ถ้าต้องให้ค่า เช่น ฝั่งขวาของ `=` หรือในวงเล็บของ `console.log()` ตรงนั้นต้องเป็น expression
ค่าที่ได้ถูกใช้ต่อหรือยัง
ถ้าไม่เก็บใส่ตัวแปรและไม่ส่งต่อ ค่านั้นจะถูกทิ้งไปหลังจบบรรทัด
บรรทัดนี้กำลังสั่งให้ทำอะไร
ถ้าเป็นประกาศหรือเปลี่ยนค่า ให้เป็น statement แยกบรรทัดของตัวเอง
Lab 1: เก็บค่าจาก expression ใส่ตัวแปร
Lab 2: ต่อข้อความด้วย expression
Lab 3: เก็บค่าที่คำนวณไว้ใช้ต่อ
Lab 4: แยกประกาศตัวแปรออกจากที่ที่ต้องการค่า
Lab 5: ซ่อมการเก็บค่าจาก `console.log()`
Lab 6: สร้างข้อความสรุปจาก expression หลายส่วน
Lab 7: ประกอบใบเสร็จสั้นจาก expression หลายชั้น
สรุปและก้าวต่อไป
- Expression คือโค้ดที่มีค่า — ถามว่า "เท่ากับอะไร" แล้วตอบได้เสมอ
- Statement คือคำสั่งที่ทำงาน เช่น ประกาศตัวแปร เปลี่ยนค่า หรือเรียกใช้เพื่อแสดงผล
- `console.log()` เป็น expression ที่ให้ค่า `undefined` จึงเก็บข้อความที่พิมพ์ใส่ตัวแปรไม่ได้
- Expression statement คือ expression ที่ถูกใช้เป็นคำสั่งเพื่อให้เกิดผลข้างเคียง
- วาง declaration ในที่ที่ต้องการค่าไม่ได้ — JavaScript จะหยุดด้วย SyntaxError
- ก้าวต่อไป: เรียน Arithmetic Operators (arithmetic-operators) เพื่อใช้ตัวดำเนินการคำนวณสร้างค่าชุดใหม่จาก expression ได้หลากหลายขึ้น