Để lập trình javascript cơ bản, nên sử dụng Node.js và Visual 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 Run → Run Without Debug → Node.js. Kết quả chạy chương trình được in ra ở tab DEBUG CONSOLE
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 var và let 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 var và let 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).
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
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 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)
}
| Cú pháp | Giải thích | Ví dụ |
|---|---|---|
|
Nếu điều kiện đúng thì thực hiện khối lệnh |
|
|
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 |
|
|
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. |
|
| Điều kiện | Ý nghĩa | Ví dụ |
|---|---|---|
| > | So sánh lớn hơn |
|
| >= | So sánh lớn hơn hoặc bằng |
|
| < | So sánh nhỏ hơn |
|
| <= | So sánh nhỏ hơn hoặc bằng |
|
| == | So sánh bằng nhau |
|
| != | So sánh khác nhau |
|
| && | Kết hợp 2 điều kiện theo logic và |
|
| || | Kết hợp 2 điều kiện theo logic hoặc |
|
| ! | Phủ định một điều kiện |
|
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);
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('');
}
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 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 |
|
| Lấy một kí tự của string | st[index] |
|
| 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 |
|
| Ghép nhiều string | st1 + st2 + ... + st_n |
|
| Ghép nhiều string sử dùng template |
`${st1}${st2}...${st_n}` Lưu ý dùng kí tự backstick ` ` |
|
| Tách string thành từng phần theo từ phân cách (delimiter) | st.split(delimiter) |
|
| Ghép mảng nhiều string bằng từ nối (delimiter) | st_arr.join(delimiter) |
|
| Kiểm tra string có chứa một string khác | st1.includes(st2) |
|
| 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 |
|
| 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 |
|
| Chuyển thành dạng viết hoa |
st.toUpperCase() |
|
| Chuyển thành dạng viết thường |
st.toLowerCase() |
|
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 |
|
| Lấy một phần tử của list | lst[index] |
|
| 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 |
|
| Thêm một phần tử vào cuối list | lst.push(new_element) |
|
| Lấy phần tử cuối ra khỏi list | lst.pop() |
|
| Xoá một phần tử trong list | lst.splice(index, 1) |
|
| Kiểm tra list có chứa một phần tử | lst.includes(element) |
|
| 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 |
|
| 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 |
|
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]
|
|
| 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;
|
|
| Lấy danh sách các trường dữ liệu của đối tượng |
Object.keys(obj)
|
|
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]));
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ử. |
|
| 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.
|
|
| 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
|
|
| 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.
|
|
| 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.
|
|
Để 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:
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:
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';
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
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
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 về client, sử dụng hàm fetch theo một trong 2 cách:
fetch(url)
.then(resp => resp.json())
.then(result => {
//TODO: Process result
})
Ví dụ:
<script>
//Ví dụ dùng hàm fetch lấy dữ liệu từ server
const url = "https://api.openweathermap.org/data/2.5/weather?id=1581129&units=metric&appid=d6477696b63c2e661af64eead58c11d9";
fetch(url)
.then((resp) => resp.json())
.then((result) => {
let temp = result.main.temp;
alert(`Current temperature : ${temp} °C`);
});
</script>
Chạy thử chương trình
async function getDataFromServer() {
let resp = await fetch(url);
let result = await resp.json();
//TODO: Process result
}
Ví dụ:
<script>
const url = "https://api.openweathermap.org/data/2.5/weather?id=1581129&units=metric&appid=d6477696b63c2e661af64eead58c11d9";
async function getTemperature() {
let resp = await fetch(url);
let result = await resp.json();
let temp = result.main.temp;
alert(`Current temperature : ${temp} °C`);
}
getTemperature();
</script>
Chạy thử chương trình
Để đẩ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>