Whitespace

Whitespace (khoảng trắng) là để tách các chuỗi kí tự. Trong một chuỗi kí tự, có những khoảng trắng không thể bị xoá và có những khoảng trắng có thể bị xoá. Ví dụ:

var ob = this;

khoảng trắng giữa varob không thể bị xoá, trong khi các khoảng trắng khác có thể bị xoá. Lệnh trên sẽ tương đương:

var ob=this;

Nhưng nếu viết như sau sẽ bị lỗi:

varob = this;

Comments

Comments (chú thích) là nội dung không được thực thi nhằm giải thích các đoạn mã JavaScript giúp người khác có thể đọc code dễ dàng hơn hoặc có thể giúp ích trong quá trình sửa lỗi chương trình.

Chú thích có hai dạng là chú thích trên một hàng bắt đầu bằng dấu // hay chú thích trên nhiều hàng (block) thì bắt đầu bằng /* và kết thúc bằng */.

Ví dụ chú thích trên một hàng:

// thay đổi tiêu đề
document.getElementById("myH").innerHTML = "My First Page";

Ví dụ chú thích trên nhiều hàng:

/*
Đoạn code sẽ thay đổi
tiêu đề với id = "myH"
và đoạn văn bản với id = "myP"
trong trang web của tôi
*/
document.getElementById("myH").innerHTML = "My First Page";
document.getElementById("myP").innerHTML = "My first paragraph.";

Chú ý: chú thích trong JavaScript nên sử dụng dấu //, hạn chế dùng /**/ vì /* có thể được dùng trong regular expressions. Ví dụ đoạn mã sau sẽ phát sinh lỗi:

/*
var rm_a = /a*/.match(s);
*/

Names

Names là các định danh như tên biến, tên hằng, tên hàm,…Các định danh bắt đầu bằng một kí tự hay dấu _ hay dấu $. Các định danh không được trùng tên các từ khoá (key words) sau:

abstract boolean break byte case catch char class const continue debugger default delete do double else enum export extends false final finally float for function goto if implements import in instanceof int interface long native new null package private protected public return short static super switch synchronized this throw throws transient true try typeof var volatile void while with undefined NaN Infinity

Numbers
Không giống nhiều ngôn ngữ lập trình khác, JavaScript chỉ có một kiểu số và số trong JavaScript luôn được lưu trữ  ở dạng dấu chấm động 64 bit (64 bit floating point), như kiểu double trong Java. Việc không phân chia nhiều kiểu dữ liệu như integer, long, short,…là một thuận lợi, nó giúp người lập trình JavaScript tránh được nhiều lỗi liên quan tới xử lí số như lỗi tràn (overflow) chẳng hạn. Hai lệnh sau là như nhau:

var x = 34.00;
var y = 34;

Đối với các số rất lớn hoặc rất nhỏ, có thể được biểu diễn bằng kí hiệu khoa học, tức dùng kí hiệu e. Xem ví dụ sau:

var x = 123e5;    // 12300000
var y = 123e-5;   // 0.00123

Số âm được biểu diễn có dấu -, ví dụ:

var y = -34;

Số thập lục phân (cơ số 16) được biểu diễn có 0x ở trước, ví dụ:

var x = 0xFF;             // x sẽ là 255

JavaScript cung cấp phương thức toString() để chuyển các số sang cơ số 2, 8, 16. Xem ví dụ:

var myNumber = 128;
myNumber.toString(16);     // trả về 80
myNumber.toString(8);      // trả về 200
myNumber.toString(2);      // trả về 10000000

Từ khoá NaN (Not a Number) dùng để chỉ ra một số không hợp lệ. Lỗi phổ biến phát sinh NaN là thực hiện các phép toán số học giữa một số và một chuỗi kí tự không phải dạng số, ví dụ:

var x = 100 / "Apple";  // x sẽ là NaN (Not a Number)

Tuy nhiên ví dụ sau là hợp lệ và không phát sinh NaN:

var x = 100 / "10";     // x = 10

JavaScript cung cấp hàm isNaN() để phát hiện NaN. Hàm này trả về true nếu phát hiện NaN, ngược lại trả về false. Xem ví dụ:

var x = 100 / "Apple";
isNaN(x);               // trả về true vì x là NaN (Not a Number)

NaN là một số. Có thể kiểm tra điều này bằng toán tử typeof như sau:

typeof NaN;             // trả về "number"

Giá trị Infinity sẽ được trả về nếu giá trị số vượt quá giới hạn cho phép (khoảng 1.79769313486231570e+308) hay thực hiện phép chia với giá trị 0.

Infinity là một số (có thể dùng typeof để kiểm tra).

JavaScript cung cấp nhiều phương thức cho số (sẽ tìm hiểu ở các phần sau). Trong JavaScript có đối tượng Math chứa một tập các phương thức thao tác với số, như phương thức Math.floor (number) dùng để chuyển một số sang số nguyên (integer).

Strings

Một string là một chuỗi kí tự được chứa trong dấu nháy đơn hay nháy kép. String có thể chứa không hoặc nhiều kí tự. Kí tự \ gọi là kí tự thoát (escape character). Các kí tự trong JavaScript có độ dài 16 bit. JavaScript không có kiểu kí tự. Kí tự trong JavaScript là string chứa một kí tự.

Các kí tự đặc biệt hay các kí tự thoát (escape sequences) gồm dấu \ và một kí tự (xem bảng dưới) có thể được chèn vào một string mà bình thường nó không được phép. Bảng các kí tự đặt biệt:

Các kí tự thoát Chức năng
\’ Single quote
\” Double quote
\\ Slashback
\n New line
\r Carriage return
\t Tab
\b Backspace
\f Form feed
\u + 4 hex digits Convert a number (hex) to a character

 

Một vài ví dụ về chèn các kí tự đặc biệt vào chuỗi:

var x = 'It\'s alright';
var y = "We are the so-called \"Vikings\" from the north."
var z = '\u0041BC'; // trả về ABC

String có thuộc tính length trả về chiều dài của chuỗi. Ví dụ:

var txt = "minh";
var txtlen = txt.length; // trả về 4

Strings là immutable, nghĩa là không thay đổi khi tạo ra.

Có thể kết hợp các chuỗi thành chuỗi mới bằng toán tử +. Ví dụ:

"a" + "b" === "ab" sẽ trả về true

JavaScript cung cấp một tập hợp các phương thức để xử lí chuỗi, ví dụ: "minh".toUpperCase() === "MINH"

Statements (các lệnh)

Các lệnh (statements) là các chỉ dẫn được thực thi bởi trình duyệt web. Mỗi lệnh trong JavaScript kết thúc bằng dấu ;. Ví dụ lệnh yêu cầu trình duyệt web hiển thị dòng  Xin chào bạn Minh trong vùng có id= "Vi_du"

document.getElementById("Vi_du").innerHTML = "Xin chào bạn Minh";

Chương trình JavaScript có nhiều lệnh. Các lệnh sẽ được thực thi tuần tự từ lệnh đầu tiên (ở trên cùng) xuống lệnh cuối cùng (top – bottom). Ví dụ các lệnh sau được thực thi tuần tự theo thứ tự 1 – 2  – 3 – 4:

var x = 5; // 1
var y = 6;  // 2
var z = x + y; // 3
document.getElementById("demo").innerHTML = z; // 4

Nếu lệnh quá dài (quá 80 kí tự), JavaScript cho phép ngắt lệnh xuống hàng mới. Ví dụ lệnh sau là hợp lệ trong JavaScript:

document.getElementById("demo").innerHTML =
"Hello Dolly.";

Nhiều lệnh liên quan tập hợp trong một khối lệnh (block). Khối lệnh (block) bắt đầu bằng { và kết thúc bằng }.

Variables (biến)

Các biến là không gian chứa các giá trị (số, chuỗi, đối tượng,…). Lệnh khai báo biến bắt đầu bằng từ khoá var. Ví dụ lệnh khai báo biến x chứa giá trị là số 5 như sau:

var x = 5;

Các biến có thể dùng trong biểu thức (expression). Ví dụ lệnh tính tổng các giá trị từ các biến price1price2 như sau:

var price1 = 5;
var price2 = 6;
var total = price1 + price2;

Tên biến là duy nhất. Khi đặt tên biến phải tuân theo các quy ước sau:

  • Tên biến chứa kí tự, kí số, $ và _.
  • Bắt đầu bằng kí tự, dấu $ hay dấu _.
  • Tên biến phân biệt hoa thường (case sensitive) tức là x khác X.
  • Tên biến không trùng các từ khoá (key words).

Khai báo biến bắt đầu bằng từ khoá var và có thể chứa giá trị hoặc không chứa giá trị. Giá trị được lưu trữ trong biến thông qua toán tử gán kí hiệu là = (khác toán tử quan hệ bằng kí hiệu ==). Ví dụ:

var pi = 3.14;
var width;

Khác với hầu hết các ngôn ngữ lập trình khác, các biến trong JavaScript khai báo không cần kiểu dữ liệu (data type). Kiểu dữ liệu của biến chính là kiểu dữ liệu của giá trị mà nó lưu trữ. Ví dụ:

var x = 5; // kiểu dữ liệu là số nguyên
x = "hello"; // kiểu dữ liệu là chuỗi

Có thể khai báo nhiều biến cùng lúc. Các biến cách nhau bởi dấu ,. Ví dụ:

var person = "John Doe", carName = "Volvo", price = 200;

Biến được khai báo trong các hàm (functions) chỉ có tác dụng trong phạm vi hàm gọi là biến địa phương (local variables) hay cục bộ, các biến khai báo ngoài các hàm gọi là biến toàn cục (glolal variables) có thể được dùng trong phạm vi toàn trang web.

Ví dụ biến toản cục và biến cục bộ:

var carName = " Volvo";// biến toàn cục
function myFunction() {
   var x = 5; // biến cục bộ, chỉ tác dụng trong phạm vi hàm myFunction()
}

Operators (Các toán tử)

Cũng như hầu hết các ngôn ngữ lập trình, JavaScript cũng hỗ trợ các toán tử gồm:

  • Toán tử số học: +, -, *, /, ++, —
  • Toán tử gán: =, +=, -=, *=, /=, %=
  • Toán tử chuỗi: nối hai hay nhiều chuỗi bằng +
  • Toán tử quan hệ: ==, ===, !=, !==, >, <, >=, <=, ?
  • Toán tử luận lý: && (And), || (Or), ! (Not)
  • Toán tử kiểu: typeof (trả về kiểu dữ liệu của biến), instanceof (trả về true nếu một object là một instance của một kiểu object).

Disruptive statement (lệnh ngắt)

Là các lệnh dừng chương trình tại một vị trí nào đó và thoát hay chuyển đến thực hiện tại một vị trí khác.

  • Lệnh break: dùng để thoát khỏi vòng lặp hay lệnh switch hay một khối lệnh nào đó.
  • Lệnh continue: bỏ qua lệnh lặp hiện tại và nhảy đến lần lặp kế tiếp hoặc sẽ trở lại tại đỉnh của khối lệnh (nếu dùng nhãn (label)).
  • Lệnh return: ngừng thực thi chương trình và trả về kết quả nào đó.
  • Lệnh throw: cho phép tạo ra các thông báo lỗi tuỳ ý.

If statement (lệnh if)

Khi viết code, chúng ta hay gặp những tình huống phải đưa ra những hành động khác nhau trong những điều kiện khác nhau. Để làm điều này, chúng ta sử dụng các lệnh điều kiện (conditional statements). Lệnh điều kiện trong JavaScript gồm lệnh ifswitch. Lệnh if có các phiên bản sau:
Lệnh if:

if (điều kiện) {
    khốí lệnh sẽ thực thi nếu điều kiện là đúng (hay true)
}

Ví dụ:

if (tuoi < 18) {
  thongbao = "Ban chua du tuoi";
}

Lệnh if…else:

if (điều kiện) {
   khốí lệnh sẽ thực thi nếu điều kiện là đúng (hay true)
} else {
   khốí lệnh sẽ thực thi nếu điều kiện là sai (hay false)
}

Ví dụ:

if (tuoi < 18) {
    thongbao = "Ban chua du tuoi";
} else {
    thongbao = "Chao mung ban den voi website chung toi!";
}

Lệnh if…else if…else:

if (điều kiện 1) {
   khốí lệnh sẽ thực thi nếu điều kiện 1 là đúng (hay true)
} else if (điều kiện 2) {
   khốí lệnh sẽ thực thi nếu điều kiện 1 là sai (hay false)và điều kiện 2 là đúng (hay true)
} else {
   khốí lệnh sẽ thực thi nếu điều kiện 1 là sai (hay false) và điều kiện 2 là sai (hay false)
}

Ví dụ:

if (time < 10) {
     greeting = "Good morning";
} else if (time < 20) {
     greeting = "Good day";
} else {
     greeting = "Good evening";
}

switch statement (lệnh switch)
Cũng là lệnh điều kiện giống if dùng để đưa ra những hành động khác nhau trong những điều kiện khác nhau.
Cú pháp:

switch(bieu_thuc) {
   case n:
      khối lệnh
      break;
   case m:
      khối lệnh
      break;
   default:
      khối lệnh mặc định
}

Cách làm việc:
Giá trị của bieu_thuc sẽ được so sánh với từng trường hợp trong case. Nếu nó khớp với trường hợp (case) nào thì sẽ thực hiện khối lệnh tại case đó và thoát khỏi switch nhờ lệnh break mà không cần kiểm tra các case còn lại. Nếu bieu_thuc không khớp với mọi case thì khối lệnh trong default sẽ thực thi.
Vi dụ: hàm getDay()sẽ trả về ngày thứ mấy trong tuần dưới dạng số từ 0..6 (Sunday=0, Monday = 1, Tuesday = 2,…). Đoạn mã sau sẽ dựa vào số 0..6 để trả về tên ngày như Sunday, Monday,….

switch (new Date().getDay()) {
  case 0:
     day = "Chu Nhat";
     break;
  case 1:
     day = "Thu Hai";
     break;
  case 2:
     day = "Thu Ba";
     break;
  case 3:
     day = "Thu Tu";
     break;
  case 4:
    day = "Thu Nam";
    break;
  case 5:
    day = "Thu Sau";
    break;
case 6:
    day = "Thu Bay";
}

Có một vài trường hợp chúng ta muốn nhiều case khác nhau thực hiện cùng một lệnh hay khối lệnh. Chúng ta làm điều này bằng cách đặt các khối lệnh chung và lệnh break phù hợp. Xét ví dụ sau:

switch (new Date().getDay()) {
  case 1:
  case 2:
  case 3:
  default:
     tb = "Cac ngay dau tuan";
     break;
  case 4:
  case 5:
    tb = "Cac ngay cuoi tuan";
    break;
  case 0:
  case 6:
    tb = "Cuoi tuan roi!";
}

try statement (lệnh try)

Trong lập trình, một trong những vấn đề quan trọng nhất là kiểm tra, phát hiện và sửa lỗi chương trình (debugging). Khi viết code trong JavaScript, chúng ta nên dùng lệnh try để việc phát hiện và xử lí lỗi thêm dễ dàng.

Cú pháp lệnh try:

try {
    khối lệnh để kiểmtra
}
catch(err) {
    Khối lệnh sẽ thực thi khi phát hiện lỗi từ try
}
finally {
    Khối lệnh sẽ thực thi mà không quan tâm kết quả từ try/catch
}

Lệnh try cho phép định nghĩa các khối lệnh sẽ được kiểm tra lỗi khi thực thi. Lệnh catch thực thi khối lệnh sẽ thực thi khi phát hiện lỗi từ try, lỗi phát hiện sẽ được lưu trữ trong biến err. Lệnh finally thực thi khối lệnh trong nó mà không cần quan tâm kết quả từ try/catch.

Xem ví dụ sau kiểm tra một biến x, ứng với mỗi trường hợp vi phạm điều kiện mà lệnh try phát hiện ra, một thông báo sẽ được “ném ra” nhờ lệnh throw và thông báo này sẽ được gán vào biến err của catch:

var message, x;
message = document.getElementById("message");
message.innerHTML = "";
x = document.getElementById("demo").value;
try {
   if(x == "") throw "rong";
   if(isNaN(x)) throw "khong phai la so";
   x = Number(x);
   if(x > 10) throw "qua cao";
   if(x < 5) throw "qua thap";
}
catch(err) {
   message.innerHTML = "Loi: " + err + ".";
}
finally {
   document.getElementById("demo").value = "";
}

Loop statements (các lệnh lặp)

Trong lập trình, có những lệnh hay khối lệnh được lặp lại nhiều lần. Thay vì viết các lệnh hay khối lệnh này nhiều lần, chúng ta có thể dùng các lệnh lặp.

Trong JavaScript có các lệnh lặp là for, for/in, whiledo/while.

Lệnh for

Dùng để lặp theo một số lần xác định cho trước. Ví dụ thực hiện lệnh xuất dòng chữ Hello 5 lần. Cú pháp lệnh for:

for ( statement 1;statement 2;statement 3) {
   Đoạn mã được lặp (1)
}

statement 1: là lệnh được thực thi trước khi (1) được thực thi.

statement 2: điều kiện lặp

statement 3: là lệnh được thực thi mỗi lần sau khi (1) thực thi

Ví dụ: lệnh hiển thị dòng Hello 5 hàng

for (i = 0; i < 5; i++) {
   text +=  "Hello" + "";
}

Cách thực thi:

Trước khi lặp: biến i được gán bằng 0 (statement 1)

Điều kiện lặp: chỉ thực hiện lặp nếu i < 5 (statement 2)

Sau mỗi lần lặp: biến i sẽ tăng 1 đơn vị (statement 3)

Lệnh for/in

Dùng để lặp qua các thuộc tính của đối tượng (object). Ví dụ:

var person = {fname:"John", lname:"Doe", age:25};
var text = "";
var x;
for (x in person) {
   text += person[x];
}

Đối tượng person có các thuộc tính là fname, lnameage. Mỗi thuộc tính sẽ có những giá trị tương ứng là John, Doe25. Biến x sẽ lưu từng giá trị từ mỗi thuộc tính của đối tượng person.

Lệnh while

Khác với for, lệnh while sẽ lặp theo một điều kiện nào đó. Chừng nào điều kiện còn đúng thì lệnh lặp sẽ vẫn thực thi. Cú pháp:

while (dieu_kien) {
 Đoạn mã được lặp (1)
}

Ví dụ: lệnh lặp sau sẽ còn thực thi chừng nào điều kiện i < 10 còn đúng, biến i sẽ tăng 1 đơn vị sau mỗi lần lặp:

i = 0;
while (i < 10) {
   text += "The number is " + i;
   i++;
}

Lệnh do/while:

Cũng giống lệnh while là lặp theo điều kiện, nhưng do/while thực thi lệnh ít nhất một lần trước khi kiểm tra điều kiện. Cú pháp:

 do{
     Đoạn mã được lặp (1)
} while (dieu_kien)

Xét ví dụ sau để phân biệt whiledo/while:

Đoạn mã sau sẽ không thực thi vì i = 11 >10

i = 11;
while (i < 10) {
   text += "The number is " + i;
   i++;
}

Đoạn mã sau sẽ thực thi và kết quả là The number is 11

i = 11;
do {
text += "The number is " + i;
i++;
} while (i < 10)

< JavaScript cơ bản