I. Lập trình javascript cơ bản

1. Cài đặt môi trường phát triển javascript

Để lập trình javascript cơ bản, nên sử dụng Node.jsVisual Studio Code

Sau khi cài đặt Node.js và VS Code, mở ứng dụng VS code, tạo mới file javascript và chạy chương trình bằng cách chọn từ menu RunRun Without DebugNode.js. Kết quả chạy chương trình được in ra ở tab DEBUG CONSOLE

2. Các cú pháp cơ bản

Khai báo biến


      var x = 1;
      let y = 2;
      let z = x + y;
      const st = "Xin chào";
    

Có thể dùng các từ khoá var, let hay const để khai báo biến

Các biến khai báo với varlet có thể thay đổi giá trị trong chương trình.

Các biến khai báo với const sẽ giữ giá trị không đổi trong toàn bộ chương trình (hằng số).

Sự khác biệt giữa varlet không nhiều, nhưng nên sử dụng let vì đây là cách khai báo mới có trong các bản javascript gần đây và tránh được một số hiệu ứng không tốt từ var ( có từ những bản đầu của javascript).


In dữ liệu ra console


      var x = 1;
      let y = 2;
      let z = x + y;
      console.log('x=', x, ', y=', y, ', z=', z);
    

Sử dụng lệnh console.log để in dữ liệu ra console

Các phép toán cơ bản

Ví dụ:


      let x = 1;
      let y = 2;
      x += 2;
      y--;
      let z = x + y;
      let t = x - y;
      let u = x * y;
      let v = x / y;
      let w = x % y;
      console.log(z, t, u, v, w);
    

Khối lệnh

Khối lệnh là một tập hợp nhiều lệnh liên tiếp nhau được đặt trong cặp dấu ngoặc nhọn {}

Khối lệnh thường được dùng trong các cú pháp rẽ nhánh (if-else) và lặp (for, while).

Giữa các lệnh trong khối lệnh ngăn cách nhau bởi dấu chấm phảy, hoặc bởi kí tự xuống dòng

Ví dụ:


      {
        let x = 1;
        let y = 2;
      }
      {
        let name = 'world'
        console.log('Hello', name)
      }
    

Lệnh rẽ nhánh có điều kiện if-else

Cú pháp Giải thích Ví dụ
if(<dieu_kien>) {
  <khoi_lenh>
}
Nếu điều kiện đúng thì thực hiện khối lệnh
let x = 1;

if(x > 0) {
  x = x - 1;
}
if(<dieu_kien>) {
  <khoi_lenh_1>
}else{
  <khoi_lenh_2>
}
Nếu điều kiện đúng thì thực hiện khối lệnh 1, nếu không thực hiện khối lệnh 2
let x = -1;

if(x > 0) {
  x = x - 1;
}else {
  x = x + 1;
}
if(<dieu_kien_1>) {
  <khoi_lenh_1>
}else if(<dieu_kien_2>){
  <khoi_lenh_2>
}else if(<dieu_kien_3>){
  <khoi_lenh_3>
...
}else{
  <khoi_lenh_n>
}

Nếu điều kiện 1 đúng thì thực hiện khối lệnh 1

nếu không kiểm tra điều kiện 2, nếu đúng thực hiện khối lệnh 2,

nếu không tiếp tục kiểm tra điều kiện tiếp theo ...

Nếu không điều kiện nào đúng thì thực hiện khối lệnh cuối.

let rating = 4.5;

if(rating < 2.5) {
  console.log('Sản phẩm kém');
}else if(rating < 3.5) {
  console.log('Sản phẩm trung bình');
}else if(rating < 4.0) {
  console.log('Sản phẩm khá tốt');
}else{
  console.log('Sản phẩm tốt');
}

Các điều kiện logic dùng trong cú pháp if-else

Điều kiện Ý nghĩa Ví dụ
> So sánh lớn hơn
if(1 > 2) console.log('1 > 2');
>= So sánh lớn hơn hoặc bằng
if(1 >= 2) console.log('1 >= 2');
< So sánh nhỏ hơn
if(1 < 2) console.log('1 < 2');
<= So sánh nhỏ hơn hoặc bằng
if(1 <= 2) console.log('1 < 2');
== So sánh bằng nhau
if(1 == 2) console.log('1 == 2');
!= So sánh khác nhau
if(1 != 2) console.log('1 != 2');
&& Kết hợp 2 điều kiện theo logic
let x = 1;
if(x > 0 && x < 100) console.log('0 < x < 100');
|| Kết hợp 2 điều kiện theo logic hoặc
let x = 1;
if(x < 0 || x > 100)
  console.log('x < 0 hoặc x > 100');
! Phủ định một điều kiện
let x = 1;
if(!(x < 0 || x > 100))
  console.log('0 <= x <= 100');

Phép toán dấu hỏi (ternary)

Cú pháp:

<dieu_kien> ? <gia_tri_1> : <gia_tri_2>

Giải thích: Nếu điều kiện đúng thì biểu thức nhận giá trị 1, nếu không biểu thức nhận giá trị 2

Ví dụ:


      let x = 1;
      let y = 2;
      let z = x < y ? x : y;
      console.log('Số bé hơn trong 2 số:', z);
    

Vòng lặp for

Cú pháp:

for(<khoi_tao_bien_lap>; <dieu_kien_tiep_tuc>; <cap_nhat_bien_lap>) {
  <khoi_lenh_lap>
}

Giải thích:

Ví dụ:


      // In ra các số chính phương từ 1 đến 100
      for(let i = 1; i <= 10; i++) {
        console.log(i, '*', i, '=', i*i);
      }

      // In ra bảng cửu chương
      for(let i = 2; i <= 10; i++) {
        for(let j = 2; j <= 10; j++){
          console.log(i, '*', j, '=', i*j);
        }
        console.log('');
      }
    

Vòng lặp while

Cú pháp:

while(<dieu_kien_tiep_tuc>;) {
  <khoi_lenh_lap>
}

Giải thích:

Ví dụ:


      // In ra các số chính phương từ 1 đến 100
      let i = 1;
      while(i <= 10) {
        console.log(i, '*', i, '=', i*i);
        i++;
      }

      // Tìm số tự nhiên nhỏ nhất chia 2 dư 1, chia 3 dư 2, chia 4 dư 3
      let n = 1;
      while(n%2 != 1 || n%3 != 2 || n%4 != 3) n++;
      console.log(n);
    

Kiểu dữ liệu String

Kiểu string dùng để lưu trữ các dữ liệu dạng văn bản. Trong javascript dữ liệu string được đặt trong cặp nháy đơn ('') hoặc nháy kép ("")

Một số thao tác thông dụng trên dữ liệu string:

Thao tác Cú pháp Ví dụ
Lấy chiều dài st.length
let ho_ten = 'Nguyễn Văn A';
console.log(ho_ten.length);
Lấy một kí tự của string st[index]
let ho_ten = 'Nguyễn Văn A';
console.log(ho_ten[0], ho_ten[7]);
Lấy một đoạn của string

st.substring(start, end)

Lưu ý: nếu không truyền vào end thì lấy hết đến cuối string

let date = '01/02/2022';
console.log('month=', date.substring(3, 5));
console.log('year=', date.substring(6));
Ghép nhiều string st1 + st2 + ... + st_n
let ho = 'Nguyễn', ten_dem = 'Văn', ten = 'A';
let ho_ten = ho + ' ' + ten_dem + ' ' + ten;
console.log(ho_ten);
Ghép nhiều string sử dùng template

`${st1}${st2}...${st_n}`

Lưu ý dùng kí tự backstick ` `

let ho = 'Nguyễn', ten_dem = 'Văn', ten = 'A';
let ho_ten = `${ho} ${ten_dem} ${ten}`;
console.log(ho_ten);
Tách string thành từng phần theo từ phân cách (delimiter) st.split(delimiter)
let st = 'Nguyễn-Văn-A';
let words = st.split('-')
console.log(words);
Ghép mảng nhiều string bằng từ nối (delimiter) st_arr.join(delimiter)
let arr = ['Nguyễn', 'Văn', 'A'];
let st = arr.join('-')
console.log(st);
Kiểm tra string có chứa một string khác st1.includes(st2)
let username = 'nguyen-van-a';
if(username.includes('-'))
   console.log('username không hợp lệ');
Tìm vị trí xuất hiện đầu tiên của một string trong một string khác

st1.indexOf(st2)

Lưu ý: nếu không tìm thấy thì kết quả trả về là -1

let username = 'nguyen-van-a';
let pos = username.indexOf('-');
console.log(pos);
Tìm vị trí xuất hiện cuối cùng của một string trong một string khác

st1.lastIndexOf(st2)

Lưu ý: nếu không tìm thấy thì kết quả trả về là -1

let username = 'nguyen-van-a';
let pos = username.lastIndexOf('-');
console.log(pos);
Chuyển thành dạng viết hoa

st.toUpperCase()

let city = 'Hà Nội';
console.log(city.toUpperCase());
Chuyển thành dạng viết thường

st.toLowerCase()

let language = 'Javascript';
console.log(language.toLowerCase());

Kiểu dữ liệu List

Kiểu List dùng để lưu trữ một dãy các phần tử (có thể cùng hoặc khác kiểu dữ liệu). Trong javascript dữ liệu List được đặt trong cặp ngoặc vuông [].

Một số thao tác thông dụng trên dữ liệu List:

Thao tác Cú pháp Ví dụ
Lấy chiều dài lst.length
let lst = [1, 2, 3, 4, 5];
console.log(lst.length);
Lấy một phần tử của list lst[index]
let lst = [1, 2, 3, 4, 5];
console.log(lst[0], lst[4]);
Lấy một đoạn của list

lst.slice(start, end)

Lưu ý: nếu không truyền vào end thì lấy hết đến cuối list

let lst = [1, 2, 3, 4, 5];
console.log(lst.slice(1, 3));
console.log(lst.slice(3));
Thêm một phần tử vào cuối list lst.push(new_element)
let lst = [1, 2, 3, 4, 5];
lst.push(6);
console.log(lst);
Lấy phần tử cuối ra khỏi list lst.pop()
let lst = [1, 2, 3, 4, 5];
let last = lst.pop();
console.log(lst, last);
Xoá một phần tử trong list lst.splice(index, 1)
let lst = [1, 2, 3, 4, 5];
lst.splice(2,1);
console.log(lst);
Kiểm tra list có chứa một phần tử lst.includes(element)
let lst = [1, 2, 3, 4, 5];
if(lst.includes(1))
   console.log('1 exists in list');
Tìm vị trí xuất hiện đầu tiên của một phần tử trong list

lst.indexOf(element)

Lưu ý: nếu không tìm thấy thì kết quả trả về là -1

let lst = [1, 2, 3, 4, 5];
let pos = lst.indexOf(2);
console.log(pos);
Tìm vị trí xuất hiện cuối cùng của một phần tử trong list

lst.lastIndexOf(element)

Lưu ý: nếu không tìm thấy thì kết quả trả về là -1

let lst = [1, 2, 3, 2, 4, 5];
let pos = lst.lastIndexOf(2);
console.log(pos);

Kiểu dữ liệu Object

Kiểu Object dùng để lưu trữ một đối tượng với các trường dữ liệu con. Trong javascript dữ liệu Object được đặt trong cặp ngoặc nhọn {}.

Một số thao tác thông dụng trên dữ liệu Object:

Thao tác Cú pháp Ví dụ
Lấy một trường dữ liệu của đối tượng
obj.field_name
hoặc
obj[field_name]
let person = {
   name: "Nguyễn Văn A",
   "date-of-birth": '01/01/2000'
};
console.log(person.name, person['date-of-birth']);
Thêm mới/cập nhật một trường dữ liệu của đối tượng
obj.field_name = value;
hoặc
obj[field_name] = value;
let person = {};
person.name = "Nguyễn Văn A";
person["date-of-birth"] = '01/01/2000'
console.log(person.name, person['date-of-birth']);
Lấy danh sách các trường dữ liệu của đối tượng
Object.keys(obj)
let person = {
   name: "Nguyễn Văn A",
   "date-of-birth": '01/01/2000'
};
console.log(Object.keys(person));

Hàm (Function)

Hàm (function) dùng để khai báo các chức năng được sử dụng lặp lại nhiều lần, hoặc để chia nhỏ chương trình thành các khối nhỏ để dễ phát triển/bảo trì.

Cú pháp khai báo hàm:

function <ten_ham>(<danh_sach_bien>) {
  // Nội dung thân hàm
  return <ket_qua>;
}

Giải thích:

Ví dụ:


      // Hàm lấy số lớn nhất trong 2 số
      function max(a, b){
        if(a > b) {
          return a;
        }else {
          return b;
        }
      }
      // Gọi hàm trong chương trình chính
      console.log(max(2, 3));

      // Hàm tính tổng một dãy số
      function sum(arr) {
        let s = 0;
        for(let i = 0; i < arr.length; i++) s += arr[i];
        return s;
      }

      // Gọi hàm trong chương trình chính
      console.log(sum([1, 2, 3, 4, 5]));
    

Hàm mũi tên (Lambda/ Arrow function)

Lambda/Arrow Function là cách khai báo một hàm dưới dạng một biến dữ liệu.

Cú pháp khai báo:

let <ten_bien_ham> = function(<danh_sach_bien>) {
  // Nội dung thân hàm
  return <ket_qua>;
}

hoặc dùng toán tử mũi tên (arrow):

let <ten_bien_ham> = (<danh_sach_bien>) => {
  // Nội dung thân hàm
  return <ket_qua>;
}

Ứng dụng của Lambda/Arrow Function: dùng để truyền tham số dạng hàm cho một hàm khác (hàm của hàm)

Một số thao tác hay sử dụng với Lambda/Arrow Function:

Thao tác Cú pháp Tác dụng Ví dụ
map lst.map(func) Biến một list thành một list mới bằng cách dùng hàm func tác động lên từng phần tử.
let lst = [1, 2, 3, 4, 5];
let lst_square = lst.map(x => x*x);
console.log(lst_square); // [1, 4, 9, 16, 25]
filter lst.filter(func)
Lọc lấy các phần tử trong list thoả mãn một điều kiện.
Hàm func là hàm trả về true/false thể hiện mỗi phần tử trong list có thoả mãn điều kiện lọc hay không.
let lst = [1, 2, 3, 4, 5];
let odd_numbers = lst.filter(x => x%2 == 1);
console.log(odd_numbers); // [1, 3, 5]
find lst.find(func)
Tìm phần tử đầu tiên trong list thoả mãn một điều kiện.
Hàm func là hàm điều kiện tương tự như trong phần filter.
Nếu trong list không có phần tử nào thoả mãn điều kiện thì trả về kết quả là undefined
let lst = [1, 2, 3, 4, 5];
let a = lst.filter(x => x%2 == 0);
console.log(a); // 2
let b = lst.filter(x => x < 0);
console.log(b); // undefined
some lst.some(func)
Kiểm tra xem trong list có ít nhất một phần tử thoả mãn một điều kiện hay không.
Hàm func là hàm điều kiện tương tự như các phần trên.
let lst = [1, 2, 3, 4, 5];
console.log(lst.some(x => x%2 == 0)); // true
console.log(lst.some(x => x < 0)); //false
every lst.every(func)
Kiểm tra xem tất cả các phần tử của list có thoả mãn một điều kiện hay không.
Hàm func là hàm điều kiện tương tự như các phần trên.
let lst = [1, 2, 3, 4, 5];
console.log(lst.every(x => x%2 == 0)); // false
console.log(lst.every(x => x > 0)); //true

II. Sử dụng javascript để điều khiển DOM

Debug javascript trên trình duyệt

Để Debug Javascript trên trình duyệt có thể sử dụng hàm alert để đưa ra thông báo (nên hạn chế dùng) hoặc dùng hàm console.log (in ra tab console của trình duyệt).

Ví dụ:

      
        <script>
          console.log('Xin chào !!!!');        
          alert('Xin chào');                
        </script>
      
Chạy thử chương trình

Để xem log trên trình duyệt, click chuột phải vào màn hình trang web, chọn inspect, menu phát triển sẽ mở ra. Chuyển sang tab console để xem nội dung log do javascript in ra:


1. Truy xuất các phần tử HTML qua id

Trong HTML, mỗi phần tử được định danh duy nhất qua id:

<div id="div1"></div>

Để truy xuất đến một phần tử HTML, javascript sử dụng hàm document.getElementById:

<script>
  let el1 = document.getElementById('div1');
</script>

Hàm document.getElementById trả về một thẻ (handle) dùng để điều khiển phần tử HTML. Một số thao tác có thể thực hiện thông qua thẻ điều khiển này:

2. Đọc/ghi nội dung các phần tử HTML

Việc đọc/ghi nội dung các phần tử HTML được thực hiện thông qua thuộc tính innerHTML của thẻ điều khiển trả về từ hàm document.getElementById trong phần trên.

Ví dụ:

      
        <body>
          <div id='div1'>Thẻ 1</div>
          <div id='div2'></div>
        </body>

        <script>
          let div1 = document.getElementById('div1');
          alert('Nội dung thẻ 1:' + div1.innerHTML);
          let div2 = document.getElementById('div2');
          div2.innerHTML = 'Thẻ 2';
        </script>
      
Chạy thử chương trình

Việc đọc nội dung thẻ được thực hiện qua việc đọc thuộc tính innerHTML:

let div1 = document.getElementById('div1');
alert('Nội dung thẻ 1:' + div1.innerHTML);

Việc ghi nội dung vào thẻ được thực hiện thông qua việc đặt gía trị cho thuộc tính innerHTML:

let div2 = document.getElementById('div2');
div2.innerHTML = 'Thẻ 2';

3. Đọc/ghi giá trị các phần tử nhập dữ liệu

Các phần tử nhập dữ liệu (input, textarea, select), chứa giá trị do người dùng nhập vào. Để đọc/ghi các giá trị này, sử dụng thuộc tính value của thẻ điều khiển trả về từ hàm document.getElementById.

Ví dụ:

      
        <body>
          <p>Họ tên: <input id="name"/></p>
          <p>Giới tính:
            <select id="gender">
              <option value="">----</option>
              <option value="male">Nam</option>
              <option value="female">Nữ</option>
            </select>
          </p>
          <button onclick='readData()'>OK</button>
        </body>

        <script>
          function readData() {
            let nameElem = document.getElementById('name');
            let name = nameElem.value;
        
            let genderElem = document.getElementById('gender');
            let gender = genderElem.value;
            
            alert(`Họ tên: ${name}, giới tính: ${gender}`);
        
            //clear data
            nameElem.value = '';
            genderElem.value = '';
          }
        </script>
      
Chạy thử chương trình

Riêng với các thẻ input thuộc loại checkbox thì sử dụng thuộc tính checked của thẻ điều khiển để đọc/ghi giá trị:

      
        <body>
          <p>Đồng ý với điều khoản sử dụng: <input type="checkbox" id="agree"/></p>
          <button onclick='readData()'>OK</button>
        </body>

        <script>
          function readData() {
            let agreeElem = document.getElementById('agree');
            let agree = agreeElem.checked;
            alert(agree?'Đã đồng ý': 'Chưa đồng ý');
          }
        </script>
      
Chạy thử chương trình

4. Xử lý sự kiện

Các sự kiện sẽ phat sinh khi người dùng thao tác với các phần tử HTML.

Mỗi sự kiện được xử lý bởi một hàm tương ứng của phần tử HTML. Hàm xử lý sự kiện có tên được bắt đầu với ký hiệu on kèm theo tên sự kiện phía sau.

Hai sự kiện thường sử dụng nhất là onclick (khi người dùng click chuột vào phần tử HTML) và onchange (khi người dùng thay đổi giá trị của các trường nhập liệu).

Ví dụ xử lý sự kiện onclick:

      
        <body>
          <button onclick="btnClk()">OK</button>
        </body>

        <script>
          function btnClk() {
            alert("OK");
          }
        </script>
      
Chạy thử chương trình

Ví dụ xử lý sự kiện onchange:

      
        <body>
          <select onchange="selChange(this)">
            <option value="1">Option 1</option>
            <option value="2">Option 2</option>
          </select>
        </body>
        
        <script>
          function selChange(el) {
            var options = el.options;
            var index = el.selectedIndex;
            alert(options[index].value);
          }
        </script>
      
Chạy thử chương trình

5. Trao đổi dữ liệu với server

Javascript dùng hàm fetch để lấy dữ liệu từ server xuống client (qua phương thức GET http), và đẩy dữ liệu từ client lên server (qua phương thức POST của http)

Lấy dữ liệu từ server xuống client:

Để lấy dữ liệu từ server về client, sử dụng hàm fetch theo một trong 2 cách:


Đẩy dữ liệu từ client lên server:

Để đẩy dữ liệu lên server, cũng sử dụng hàm fetch, nhưng truyền vào thêm các tham số:

Ví dụ:

    
      <script>
        // Đẩy dữ liệu lên server theo dạng FormData

        function sendMessage(message){
          const url = "http://<SERVER_URL>/send-messsage";
          let data = new FormData();
          data.append("message", message);

          fetch(url, {method: "POST", body: data})
            .then(resp => resp.json())
            .then(result => console.log(result));
        }

      </script>
    
  
    
      <script>
        // Đẩy dữ liệu lên server theo dạng JSON

        function sendMessage(message){
          const url = "http://<SERVER_URL>/send-messsage";
          let data = {message: message};
          data = JSON.stringify(data);

          let headers = {
            'Content-Type': 'application/json'
          };

          fetch(url, {method: "POST", body: data, headers: headers})
            .then(resp => resp.json())
            .then(result => console.log(result));
        }

      </script>