❖ 1. ស្គាល់ដំបូងអំពី JavaScript

1.1 JavaScript គឺជាអ្វី រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

JavaScript ជាភាសាកម្មវិធីតែមួយគត់ដែលកម្មវិធីរុករក (Browser) ស្គាល់ដោយផ្ទាល់។ HTML ស្ថាបនារចនាសម្ព័ន្ធ, CSS តុបតែងរូបរាង, ចំណែក JavaScript ធ្វើឲ្យទំព័រមាន "ជីវិត" (អន្តរកម្ម, ការគណនា, ការផ្លាស់ប្តូរដោយស្វ័យប្រវត្តិ)។ បច្ចុប្បន្នវាក៏ប្រើនៅខាង Backend (Node.js), Mobile App, និង Desktop App ផងដែរ។

1.2 របៀបភ្ជាប់ JavaScript ទៅកាន់ HTML រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

វិធីការប្រើប្រាស់
Internalដាក់កូដក្នុង <script>...</script> ដោយផ្ទាល់ក្នុងទំព័រ
External<script src="app.js"></script> ល្អសម្រាប់ Project ពិតប្រាកដ
<script>
  console.log("សួស្តី JavaScript!");
</script>
គន្លឹះ៖ ដាក់ <script> ភ្ជាប់ File ខាងក្រៅមុន </body> (មិនមែនក្នុង <head>) ដើម្បីធានាថា HTML ទាំងមូលផ្ទុករួចជាមុនសិន JS ចាប់ផ្ដើមរត់។

1.3 Console (កន្លែងសាកល្បងកូដ) រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

console.log() បោះពុម្ពតម្លៃចេញទៅ Console របស់ Browser (បើក DevTools ដោយចុច F12) ជាឧបករណ៍ដ៏សំខាន់បំផុតសម្រាប់ពិនិត្យមើលថាកូដដំណើរការត្រឹមត្រូវដែរឬអត់។

console.log("តម្លៃមួយ");
console.log(10 + 5);
console.log("អាយុ:", 25);

❖ 2. អថេរ និងប្រភេទទិន្នន័យ

2.1 let, const, var (បីវិធីប្រកាសអថេរ) រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

Keywordការប្រើប្រាស់
letអថេរដែលអាចផ្លាស់ប្តូរតម្លៃពេលក្រោយបាន (ស្តង់ដារបច្ចុប្បន្ន)
constតម្លៃថេរ មិនអាចផ្លាស់ប្តូរឡើយក្រោយពីកំណត់ដំបូង
varរបៀបចាស់ (មុន 2015) មានបញ្ហា Scope គួរជៀសវាងកុំប្រើក្នុងកូដថ្មី
let city = "ភ្នំពេញ";
const pi = 3.14159;

city = "សៀមរាប";  // ធ្វើបាន ព្រោះជា let
// pi = 3.2;      // Error! ព្រោះជា const

2.2 ប្រភេទទិន្នន័យសំខាន់ៗ រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

ប្រភេទឧទាហរណ៍
number10, 3.14, -5 (មិនបែងចែក int/float ដូច C)
string"សួស្តី", 'Hello'
booleantrue, false
undefinedអថេរដែលប្រកាសហើយ តែមិនទាន់មានតម្លៃ
nullតម្លៃទទេ ដែលកំណត់ដោយចេតនា
object / arrayក្រុមទិន្នន័យស្មុគស្មាញ (មើលមេរៀនទី៦, ៧)
console.log(typeof 10);        // "number"
console.log(typeof "សួស្តី");   // "string"
console.log(typeof true);      // "boolean"

2.3 Template Literals (ការតភ្ជាប់អត្ថបទបែបទំនើប) រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

ប្រើសញ្ញា Backtick (`) ជំនួសសញ្ញាសម្រង់ធម្មតា ដើម្បីបញ្ចូលអថេរដោយផ្ទាល់ក្នុងអត្ថបទតាមរយៈ ${...}

const name = "សុភា";
const age = 22;

console.log(`ខ្ញុំឈ្មោះ ${name} អាយុ ${age} ឆ្នាំ`);

លទ្ធផល៖ ខ្ញុំឈ្មោះ សុភា អាយុ 22 ឆ្នាំ

❖ 3. ប្រមាណវិធី និងលក្ខខណ្ឌ

3.1 Arithmetic & Comparison Operators រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

Operatorន័យ
+ - * / %បូក ដក គុណ ចែក យកសំណល់
==ស្មើគ្នា (ប្រៀបធៀបតម្លៃ ប៉ុន្តែមិនប្រៀបធៀបប្រភេទ)
===ស្មើគ្នាទាំងតម្លៃ និងប្រភេទ (ណែនាំឲ្យប្រើនេះជានិច្ច)
!==មិនស្មើគ្នា (តម្លៃ ឬប្រភេទ)
console.log(5 == "5");   // true  (ប្រៀបធៀបតែតម្លៃ)
console.log(5 === "5");  // false (ប្រភេទខុសគ្នា: number vs string)
សំខាន់! ប្រើ === ជានិច្ចជំនួស == ដើម្បីជៀសវាងកំហុសមិនរំពឹងទុក ដែលបណ្តាលមកពី JavaScript ព្យាយាមបម្លែងប្រភេទដោយស្វ័យប្រវត្តិ។

3.2 if / else if / else រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

const score = 75;

if (score >= 90) {
  console.log("និទ្ទេស A");
} else if (score >= 70) {
  console.log("និទ្ទេស B");
} else {
  console.log("និទ្ទេស C");
}

3.3 Ternary Operator & Logical Operators រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

const age = 20;
const status = age >= 18 ? "ពេញវ័យ" : "អនីតិជន";
console.log(status);

const hasTicket = true;
if (age >= 18 && hasTicket) {
  console.log("អនុញ្ញាតឲ្យចូល");
}
Operatorន័យ
&&AND ត្រូវទាំងសងខាង
||OR ត្រូវខាងណាមួយ
!NOT ដាក់បញ្ច្រាស

❖ 4. រង្វិលជុំ (Loops)

4.1 for Loop រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

for (let i = 1; i <= 5; i++) {
  console.log(`ជុំទី ${i}`);
}

4.2 while & do...while រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

let battery = 100;
while (battery > 0) {
  console.log(`ថ្ម: ${battery}%`);
  battery -= 25;
}

4.3 for...of & for...in រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

Loopការប្រើប្រាស់
for...ofដើរលើតម្លៃក្នុង Array (ការប្រើប្រាស់ញឹកញាប់បំផុត)
for...inដើរលើឈ្មោះសោ (key) ក្នុង Object
const fruits = ["ស្វាយ", "ចេក", "ឪឡឹក"];
for (const fruit of fruits) {
  console.log(fruit);
}
ចំណាំ៖ break និង continue ដំណើរការដូចនឹង C/Python ដែរ៖ break ចេញពី Loop ទាំងស្រុង, continue រំលងទៅជុំបន្ទាប់។

❖ 5. Functions

5.1 Function Declaration & Function Expression រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

// Function Declaration
function greet(name) {
  return `សួស្តី ${name}`;
}

// Function Expression
const greet2 = function(name) {
  return `សួស្តី ${name}`;
};

console.log(greet("សុខា"));

5.2 Arrow Functions រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

Arrow Function ជាទម្រង់ខ្លីជាង សរសេរដោយប្រើសញ្ញា => ពេញនិយមណាស់ក្នុងកូដទំនើប។

const add = (a, b) => a + b;
console.log(add(3, 5));

// បើមានតែ parameter មួយ អាចលុបវង់ក្រចកចេញបាន
const square = x => x * x;
console.log(square(4));

5.3 Default Parameters & Scope រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

function greet(name = "ភ្ញៀវ") {
  console.log(`សួស្តី ${name}`);
}

greet();          // សួស្តី ភ្ញៀវ
greet("ដារា");     // សួស្តី ដារា
ចំណាំ៖ អថេរដែលប្រកាសក្នុង Function (Local Scope) មិនអាចហៅប្រើនៅខាងក្រៅបានទេ ដូចគ្នានឹងគោលការណ៍ Scope ក្នុងភាសាកម្មវិធីភាគច្រើន។

❖ 6. Arrays & Array Methods

6.1 ការបង្កើត និងកែប្រែ Array រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

const fruits = ["ស្វាយ", "ចេក", "ឪឡឹក"];
fruits.push("ក្រូច");        // បន្ថែមទៅចុង
fruits.pop();               // លុបធាតុចុងក្រោយ
console.log(fruits[0]);     // ស្វាយ
console.log(fruits.length); // 3

6.2 Array Methods ដែលប្រើញឹកញាប់ រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

Methodការប្រើប្រាស់
.map()បម្លែងធាតុនីមួយៗ ត្រឡប់ជា Array ថ្មី
.filter()ជ្រើសរើសធាតុតាមលក្ខខណ្ឌ ត្រឡប់ជា Array ថ្មី
.forEach()ដំណើរការមុខងារលើធាតុនីមួយៗ (មិនត្រឡប់អ្វី)
.reduce()បញ្ចូលធាតុទាំងអស់ទៅជាតម្លៃតែមួយ
.find()រកធាតុទីមួយដែលត្រូវលក្ខខណ្ឌ
const numbers = [1, 2, 3, 4, 5];

const doubled = numbers.map(n => n * 2);
console.log(doubled);          // [2, 4, 6, 8, 10]

const evens = numbers.filter(n => n % 2 === 0);
console.log(evens);            // [2, 4]

const sum = numbers.reduce((total, n) => total + n, 0);
console.log(sum);              // 15
គន្លឹះ៖ .map(), .filter(), .reduce() មិនផ្លាស់ប្តូរ Array ដើមទេ (Immutable) គឺតែងតែត្រឡប់ជាតម្លៃ/Array ថ្មី ដែលធ្វើឲ្យកូដមានសុវត្ថិភាពជាង។

❖ 7. Objects

7.1 ការបង្កើត និងចូលប្រើ Object រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

const student = {
  name: "សុវណ្ណ",
  age: 20,
  skills: ["HTML", "CSS", "JavaScript"]
};

console.log(student.name);      // Dot notation
console.log(student["age"]);    // Bracket notation

student.age = 21;                // កែប្រែតម្លៃ
student.school = "សាកលវិទ្យាល័យ"; // បន្ថែម Property ថ្មី

7.2 Object Methods & Destructuring រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

const person = {
  name: "លីណា",
  greet() {
    console.log(`សួស្តី ខ្ញុំឈ្មោះ ${this.name}`);
  }
};
person.greet();

// Destructuring ទាញយក Property ចេញជាអថេរដោយផ្ទាល់
const { name, age } = student;
console.log(name, age);
សំខាន់! ក្នុង Method របស់ Object, this សំដៅទៅ Object ខ្លួនឯង ជាគំនិតគន្លឹះមួយក្នុង JavaScript ដែលត្រូវយល់ច្បាស់មុននឹងចូលទៅដល់ React។

❖ 8. DOM Manipulation

8.1 ការជ្រើសរើស Element រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

DOM (Document Object Model) ជា "ផែនទី" របស់ទំព័រ HTML ដែល JavaScript អាចចូលទៅអាន ឬកែប្រែបាន។

Methodការប្រើប្រាស់
document.querySelector()ជ្រើសរើស Element ទីមួយដែលត្រូវនឹង CSS Selector
document.querySelectorAll()ជ្រើសរើស Element ទាំងអស់ដែលត្រូវនឹង CSS Selector
document.getElementById()ជ្រើសរើសតាម id ដោយផ្ទាល់ (លឿនជាង តែសរសេរវែងជាង)
const title = document.querySelector("h1");
const allButtons = document.querySelectorAll("button");

console.log(title.textContent);

8.2 ការកែប្រែខ្លឹមសារ និងរចនាប័ទ្ម រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

Propertyការប្រើប្រាស់
.textContentអាន/កែអត្ថបទសុទ្ធ (គ្មាន HTML Tag)
.innerHTMLអាន/កែខ្លឹមសារជា HTML (អាចបញ្ចូល Tag ថ្មីបាន)
.styleកែ CSS ដោយផ្ទាល់តាមរយៈ JavaScript
.classListបន្ថែម/លុប/ត្រួតពិនិត្យ Class (ឧ. .add(), .remove(), .toggle())
const box = document.querySelector(".box");
box.textContent = "អត្ថបទថ្មី";
box.style.color = "blue";
box.classList.add("active");
box.classList.toggle("hidden");

❖ 9. Events & Forms

9.1 addEventListener រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

const button = document.querySelector("#myButton");

button.addEventListener("click", function() {
  console.log("ប៊ូតុងត្រូវបានចុច!");
});

// ឬសរសេរខ្លីជាងជាមួយ Arrow Function
button.addEventListener("click", () => alert("សួស្តី!"));
Eventពេលណាកើតឡើង
clickពេលចុច
inputពេលអ្នកប្រើវាយបញ្ចូលក្នុង Input
submitពេលបញ្ជូន Form
keydownពេលចុចគ្រាប់ចុចណាមួយ

9.2 ការគ្រប់គ្រង Form រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

const form = document.querySelector("form");

form.addEventListener("submit", function(event) {
  event.preventDefault();  // ការពារកុំឲ្យទំព័រ Reload
  const nameInput = document.querySelector("#name").value;
  console.log(`បានបញ្ជូនឈ្មោះ: ${nameInput}`);
});
ចំណាំ៖ event.preventDefault() ចាំបាច់ត្រូវហៅ ដើម្បីបញ្ឈប់ Form ពី "ឥរិយាបថធម្មតា" របស់វា (ដែលធម្មតានឹង Reload ទំព័រទាំងមូល) ដើម្បីឲ្យយើងគ្រប់គ្រងទិន្នន័យដោយ JavaScript ជំនួសវិញ។

❖ 10. Asynchronous JavaScript

10.1 Callback vs Promise រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

Asynchronous ជាការធ្វើកិច្ចការចំណាយពេលយូរ (ឧ. ហៅ API) ដោយមិនកាត់ផ្តាច់ការដំណើរការទំព័រនៅសល់។ Promise ជាទម្រង់ទំនើបជាង Callback សម្រាប់គ្រប់គ្រងលទ្ធផលនាពេលអនាគត។

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("ទិន្នន័យបានមកដល់!");
  }, 2000);
});

promise.then(result => console.log(result));

10.2 async / await រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

async/await ជាទម្រង់ខ្លីជាង និងអានងាយជាង .then() ដោយសរសេរកូដ Asynchronous ឲ្យមើលទៅដូចកូដធម្មតា (Synchronous)។

async function fetchData() {
  console.log("កំពុងទាញយក...");
  const result = await promise;
  console.log(result);
}

fetchData();

10.3 fetch() (ការហៅ API) រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

async function getUsers() {
  const response = await fetch("https://api.example.com/users");
  const data = await response.json();
  console.log(data);
}

getUsers();

លំហាត់អនុវត្ត

  1. សរសេរ Function ដែលទទួល Array នៃលេខ ហើយត្រឡប់តែលេខសេស ដោយប្រើ .filter()
  2. បង្កើត Object តំណាងឲ្យសៀវភៅមួយក្បាល (ចំណងជើង, អ្នកនិពន្ធ, ចំនួនទំព័រ) រួចបង្ហាញព័ត៌មានតាមរយៈ Method។
  3. ប្រើ addEventListener ធ្វើឲ្យប៊ូតុងផ្លាស់ប្តូរពណ៌ផ្ទៃខាងក្រោយរាល់ពេលចុច។
  4. សរសេរ Form តូចមួយដែលទទួលឈ្មោះ ហើយបង្ហាញសារស្វាគមន៍ដោយមិន Reload ទំព័រ។