JavaScript (2) - Cú pháp, kiểu dữ liệu và biến

 

1         Cú pháp, kiểu dữ liệu và biến

Sau khi học phần trước, chúng ta đã biết cách viết và chạy một chương trình JavaScript đơn giản. Trong phần này, chúng ta sẽ tìm hiểu về cú pháp, kiểu dữ liệu và biến trong ngôn ngữ JavaScript. Bạn nên vừa đọc lý thuyết vừa lập trình và quan sát kết quả, nó sẽ giúp bạn nhớ được cú pháp, hiểu được nội dung lý thuyết và có kĩ năng làm việc tốt hơn.

1.1       Cú pháp

Câu lệnh

Chương trình JavaScript được tạo thành từ các câu lệnh (statement). Câu lệnh là một chỉ dẫn cho máy tính thực hiện một công việc cụ thể. Kết thúc câu lệnh là một dấu chấm phẩy (;), hoặc xuống hàng (line break, new line).

Ví dụ sau đây là 2 câu lệnh, mỗi câu lệnh nằm trên 1 hàng, kết thúc câu lệnh bằng cách xuống hàng:

const message = 'Chao bac Teo!'

alert(message)

Ở ví dụ sau, chúng ta dùng dấu chấm phẩy để kết thúc một lệnh, bạn nên sử dụng cách này:

const message = 'Chao bac Teo!';

alert(message);

Nếu sử dụng dấu chấm phẩy, bạn có thể viết nhiều lệnh trên một hàng, tuy nhiên không khuyến khích sử dụng cách này, vì làm cho mã nguồn khó đọc:

const message = 'Chao bac Teo!';alert(message);

Khối lệnh là tập hợp của nhiều lệnh, được bao lại bằng cặp ngoặc nhọn {}, kết thúc khối lệnh không cần dấu chấm phẩy.  Ví dụ:

{

const message = 'Chao bac Teo!';

alert(message);

}

Khoảng trắng

Khoảng trắng gồm kí tự trắng (space), tab, dấu xuống hàng (new line). Các khoảng trắng dư thừa sẽ bị bỏ qua khi dịch mã. Vì vậy, chúng ta nên sử dụng các khoảng trắng cho phù hợp, để mã nguồn có bố cục rõ dàng, dễ đọc.

Ví dụ, thay vì viết mã như thế này:

const message='Chao bac Teo!';alert(message);

Thì chúng ta có thể sử dụng các khoảng trắng và dấu xuống hàng để mã nguồn dễ đọc hơn:

const message = 'Chao bac Teo!';

alert(message);

Phân biệt chữ hoa và chữ thường

JavaScript là ngôn ngữ có phân biệt chữ hoa và chữ thường (case-sensitive). Ví dụ, nếu đặt một biến có tên là “myVariable”, một biến khác có tên là “myvariable”, và một biến có tên là “MyVariable” thì sẽ tạo ra ba biến khác nhau.

const myVariable = 'a';

const myvariable = 'b';

const MyVariable = 'c';

Từ dành riêng

Từ dành riêng (reserved words) là các từ khóa được ngôn ngữ JavaScript độc quyền sử dụng. Do vậy chúng ta không thể, hoặc không nên sử dụng các từ khóa này để đặt tên biến, tên hàm, hay thuộc tính. Ví dụ một số từ dành riêng của JavaScript:

abstract, await, 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, let, 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, yield, undefined, NaN, Infinity

Ví dụ, chúng ta đặt tên biến là case thì chương trình sẽ báo lỗi:
 const case = 'dung tu khoa dat ten bien';

Chú thích

Chú thích (comment) là những lời giải thích, hoặc những mô tả đi kèm với các đoạn mã. Mục đích giúp người lập trình sau này có thể dễ dàng hiểu được chức năng hoặc cách làm việc của một đoạn mã. Ngoài ra, trong quá trình tìm và sửa lỗi (debug) cũng thường hay sử dụng chức năng chú thích để che các đoạn mã không muốn thực thi.

Phần chú thích sẽ được bỏ qua khi trình duyệt thực thi đoạn mã JavaScript. Có hai cách để tạo chú thích: tạo chú thích từng hàng và tạo chú thích nhiều hàng.

Để tạo chú thích từng hàng, đặt hai dấu xuyệt (//) ở đầu nội dung chú thích, JavaScript sẽ hiểu phần nội dung nằm sau dấu xuyệt cho đến hết hàng là chú thích (không cần có dấu kết thúc). Ví dụ:

// day la cau chao

            alert("Chao bac Teo");

Hoặc,

alert("Chao bac Teo"); // day la cau chao

Để tạo chú thích trên nhiều hàng, sử dụng kí hiệu /* */ để bao lại phần nội dung chú thích, ví dụ:

/* đây là câu chào

nó sẽ xuất hiện trong một cửa sổ

trên trình duyệt */

 alert("Chao bac Teo");

Khi lập trình, chúng ta nên đặt tên biến, tên hàm và viết mã nguồn có ngữ nghĩa rõ ràng, dễ hiểu. Khi đó bản thân mã nguồn đã cho biết nó thực hiện việc gì và thực hiện như thế nào mà không nhất thiết phải có đoạn chú thích. Bạn có thể đọc thêm các bài viết liên quan đến sử dụng chú thích trong các chủ đề về clean code. Tóm lại là không nên viết quá nhiều chú thích trong mã nguồn.

1.2       Kiểu dữ liệu

Dữ liệu được định nghĩa là:

– Một chuỗi gồm một hoặc nhiều kí hiệu (sequence of one or more symbols), ví dụ: 123, ‘nguyen van teo’.

– Ở mức thấp nhất, ví dụ khi dữ liệu được lưu trên RAM, nó sẽ được biểu diễn dưới dạng hệ số nhị phân (0 và 1)

– Cần được thông dịch (diễn dịch) để trở thành thông tin

– Biểu diễn số lượng, tính chất hoặc chỉ dẫn hoạt động

– Được tổ chức trong nhiều loại cấu trúc dữ liệu khác nhau

Trong lập trình, dữ liệu được chia thành nhiều kiểu (loại). Mỗi kiểu cho biết miền giá trị, các phép toán có thể thực hiện trên nó, ý nghĩa của dữ liệu và cách thức lưu trữ.

Kiểu dữ liệu giúp cho chương trình dịch đoán được ý định xử lý dữ liệu của lập trình viên.

JavaScript có 7 kiểu dữ liệu khác nhau, trong đó có 6 kiểu dữ liệu cơ bản (primitive data type) và kiểu dữ liệu object.

Các kiểu dữ liệu cơ bản gồm:

– String

– Symbol

– Number

– Boolean

– Undefined

– Null

Các dữ liệu không thuộc 6 kiểu cơ bản trên sẽ là kiểu object, ví dụ mảng, hàm và object literal (đối tượng nguyên bản).

Toán tử typeof

Trong JavaScript, chúng có thể sử dụng toán tử (operator) typeof để kiểm tra xem một dữ liệu thuộc kiểu gì?

Ví dụ:

typeof 'hi bac Teo';

<'string'

typeof 123

<'number'

typeof true

<'boolean'

typeof true;

<'boolean'

typeof {ten : 'van teo'};

<'object'

typeof [1, 2, 3];

<'object'

1.3       Biến

Khi lập trình, chúng ta cần sử dụng các biến (variable) để chứa dữ liệu. Hiểu đơn giản, biến chính là các ô nhớ (hay thùng chứa) trong bộ nhớ, dùng để chứa dữ liệu bên trong. Mỗi biến được đại diện bằng một cái tên. Ví dụ, hình dưới đây minh họa một biến có tên là num, và có giá trị là 5:


Ví dụ sau sẽ tạo ra một biến có tên là tuoi và gán cho nó giá trị là 20:

var tuoi = 20;

Để khai báo biến, chúng ta sử dụng từ khóa var (viết tắt của variable), theo sau là tên biến, dấu “=” dùng để gán giá trị, 20 là giá trị gán cho biến, và kết thúc câu lệnh là dấu chấm phẩy (;).

JavaScript là ngôn ngữ định kiểu yếu, hay định kiểu động. Do vậy, khi khai báo biến sẽ không cần xác định kiểu của biến. Giá trị trong biến sẽ cho biết kiểu dữ liệu của biến là gì. Một biến có thể chứa mọi loại dữ liệu, như số, chuỗi kí tự, phần tử DOM, hàm. Ở ví dụ sau, khi gán tuoi = 20 thì kiểu dữ liệu của nó là number, tuy nhiên, vẫn biến đó, nhưng khi gán tuoi = ' hai muoi' thì kiểu dữ liệu lại là string.

var tuoi = 20;

typeof(tuoi);

<'number'

tuoi = 'hai muoi';

typeof(tuoi);

<'string'

Tên biến là một chuỗi bất kì, miễn là không trùng với các từ khóa độc quyền của JavaScript. Tuy nhiên, cần đặt tên biến sao cho có ý nghĩa, dễ dàng đoán ra mục đích của nó. Như ở ví dụ trên, chúng ta có thể dùng tên biến là “so” (số) thay cho “tuoi” (tuổi), tuy nhiên, dùng là “tuoi” sẽ cụ thể và dễ hiểu hơn.

Về mặt cú pháp, tên biến cần tuân theo các quy tắc sau:

– Tên biến phải bắt đầu bằng một chữ cái hoặc kí tự gạch dưới (_)

– Tên biến chỉ bao gồm các kí tự, kí số và kí tự gạch dưới

– Tên biến không chứa khoảng trắng

– Tên biến có phân biệt chữ hoa, chữ thường

Với tên biến gồm nhiều từ, để dễ dàng nhận diện được các từ, có thể sử dụng nhiều cách, ví dụ chúng ta có thể sử dụng một trong hai cách sau:

– Sử dụng dấu gạch dưới (_) (underscore), ví dụ: variable_name

– Sử dụng kiểu u lạc đà (camelCase), ví dụ: variableName. Lập trình viên JavaScript hay sử dụng cách này.

Trước phiên bản ES6, chúng ta dùng từ khóa var để khai báo biến. Từ ES6 trở đi, chúng ta có thể sử dụng thêm hai từ khóa để khai báo biến là constlet. Một biến được khai báo bằng từ khóa const sẽ được gán giá trị cố định khi khai báo, và sau đó thì không cho thay đổi giá trị. Có thể hiểu, biến được khai báo bằng từ khóa const chính là một hằng (constant). Lưu ý, tính chất này chỉ đúng khi giá trị gán cho biến thuộc 6 kiểu dữ liệu căn bản.

Một biến được khai báo bằng từ khóa let hoạt động như khi khai báo bằng từ khóa var, tuy có một chút khác biệt.

Ví dụ dùng từ khóa const:

const namSinh = 2000;

namSinh = 2001;

Uncaught TypeError: Assignment to constant variable.

    at <anonymous>:2:9

Ví dụ dùng từ khóa let:

let diem = 7;

diem = 8;

console.log(diem);

< 8

Dùng từ khóa var để khai báo biến có thể xảy ra một số vấn đề liên quan đến phạm vi của biến (sẽ tìm hiểu ở các phần sau), vì vậy, chúng ta nên sử dụng từ khóa let const để khai báo biến và hằng.

Chúng ta có thể khai báo và gán giá trị cho nhiều biến trên cùng một hàng, mỗi khai báo ngăn cách nhau bằng dấu phẩy (,).

let x = 1, y = 2, z = 3;

console.log(x, y, z);

< 1 2 3

Như ở phần trên đã đề cập, khi chúng ta dùng từ khóa const để khai báo biến, nếu không phải là kiểu dữ liệu căn bản (6 kiểu), thì vẫn có thể thay đổi dữ liệu của một biến. Ví dụ :

const arr = [1, 2, 3];

arr[0] = 4; // thay đổi giá trị của mảng

console.log(arr);

< (3) [4, 2, 3]

Nhưng một biến được khai báo bằng từ khóa const sẽ không cho gán một đối tượng khác vào biến ban đầu. Ví dụ:

const arr1 = [4, 5, 6];

arr1 = [7, 8, 9];

Uncaught TypeError: Assignment to constant variable.

    at <anonymous>:2:6

Mặc dù khai báo biến bằng const vẫn còn những hạn chế, tuy nhiên, chúng ta vẫn nên xem xét để sử dụng nó nhiều nhất có thể. Vì nó giúp chúng ta tránh được một số tình huống không mong đợi do việc thay đổi giá trị của biến trong chương trình.

Khác so với var, việc khai báo biến bằng let và const sẽ không cho phép ghi đè lên các phương thức tạo sẵn (built-in method), đồng thời phạm vi của biến sẽ được xem xét ở mức độ block (block scope).

1.4       Xem và đọc thêm

– [1] Dùng các từ khóa sau tìm kiếm trên mạng để đọc thêm: kiểu dữ liệu wiki, data type wiki

– [2] Darren Jones, JavaScript Novice To Ninja, second edition, SitePoint, 2017,  trang 31 tới 59

1.5       Bài tập và thực hành

Bài tập 1. Viết lại các đoạn mã trong phần lý thuyết.

Bài tập 2. Sử dụng toán tử typeof, điền kết quả vào bảng sau, giải thích kết quả:

Dữ liệu

Kiểu dữ liệu

null

 

undefined

 

0

 

True (lưu ý: chữ t viết hoa)

 

true (lưu ý : chữ t viết thường)

 

'True'

 

1e5

 

Gợi ý:

Bài tập 2.

Dữ liệu

Kiểu dữ liệu

null

Object

undefined

Undefined

0

Number

True (lưu ý: chữ t viết hoa)

Undefined

true (lưu ý : chữ t viết thường)

Boolean

'True'

String

1e5

Number

1.6       Câu hỏi ôn tập

Câu 1. Trong JavaScript, đoạn mã này: const case = 'dung tu khoa dat ten bien'; bị lỗi gì?

A. Dấu gán phải là ‘:=’

B. Thừa dấu chấm phẩy ( ;) ở cuối câu lệnh

C. Phải bao một chuỗi bằng dấu nháy kép ("")

D. Dùng từ khóa để đặt tên biến

Câu 2. Trong JavaScript, dòng mã sau sẽ xuất gì ra màn hình?

typeof(3.1415);

A. PI

B. Number

C. Double

D. Integer

Câu 3. Khi lập trình, có nhiều cách để viết tên các biến, ví dụ một biến có tên là  fullName thì nó được viết theo phong cách gì?

A. PascalCase

B. snake_case

C. camelCase

D. kebab-case

Câu 4. Trong JavaScript, tên biến nào sau đây bị lỗi?

A. var full-name = 'nguyen van teo';

B. var full_name = 'nguyen van teo';

C. var full4Name = 'nguyen van teo';

D. var $fullName = 'nguyen van teo';

-----

Cập nhật: 20/8/2023

-----

Bạn muốn tự học HTML bài bản? Xem thêm