JavaScript: Tìm hiểu về cú pháp và cấu trúc lập trình trong JavaScript

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Giới thiệu

Trước khi học viết bằng ngôn ngữ nói, trước tiên bạn phải học các quy tắc ngữ pháp. Dưới đây là một vài ví dụ về các quy tắc bạn có thể tìm thấy bằng tiếng Anh:

  • Một câu bắt đầu bằng một chữ cái viết hoa.
  • Một câu kết thúc bằng một dấu chấm.
  • Một đoạn văn mới được thụt lề.
  • Lời thoại được đặt trong dấu ngoặc kép.

Tương tự như vậy, tất cả các ngôn ngữ lập trình phải tuân theo các quy tắc cụ thể để hoạt động. Tập hợp các quy tắc xác định cấu trúc chính xác của ngôn ngữ lập trình được gọi là cú pháp . Nhiều ngôn ngữ lập trình bao gồm phần lớn các khái niệm tương tự với các biến thể về cú pháp.

Trong bài hướng dẫn này, chúng ta sẽ xem xét nhiều quy tắc và quy ước về cú pháp và cấu trúc mã JavaScript.

Chức năng và khả năng đọc

Chức năng và khả năng đọc là hai lý do quan trọng để tập trung vào cú pháp khi bạn bắt đầu làm việc với JavaScript.

Có một số quy tắc cú pháp bắt buộc đối với chức năng JavaScript. Nếu chúng không được tuân theo thì console sẽ thông báo lỗi và tập lệnh sẽ ngừng thực thi.

Hãy xem xét một lỗi cú pháp trong chương trình "Hello, World!":

// Ví dụ về một chương trình JavaScript lỗi
console.log("Hello, World!"

Lệnh trên thiếu dấu ngoặc đóng và thay vì in dòng "Hello, World!" vào bảng điều khiển, lỗi sau sẽ xuất hiện:

Output

Uncaught SyntaxError: missing ) after argument list

Phần còn thiếu ) phải được thêm vào trước khi tập lệnh tiếp tục chạy. Đây là một ví dụ về cách một lỗi trong cú pháp JavaScript có thể phá vỡ tập lệnh, vì phải tuân theo cú pháp chính xác để mã chạy được.

Một số khía cạnh của cú pháp và định dạng JavaScript dựa trên các trường phái suy nghĩ khác nhau. Có nghĩa là, có các quy tắc hoặc lựa chọn phong cách không bắt buộc và sẽ không dẫn đến lỗi khi mã được chạy. Tuy nhiên, có nhiều quy ước chung hợp lý để tuân theo, vì các nhà phát triển giữa các dự án và cơ sở mã sẽ quen thuộc hơn với phong cách này. Việc tuân thủ các quy ước chung dẫn đến khả năng đọc được cải thiện.

Hãy xem xét ba ví dụ sau đây về phép gán biến.

const greeting="Hello";         // không có dấu space giữa biến và chuỗi
const greeting =       "Hello"; // có quá nhiều dấu spce sau phép gán
const greeting = "Hello";       // có một dấu space giữa biến và chuỗi

Mặc dù cả ba ví dụ trên sẽ cho kết quả hoàn toàn giống nhau, nhưng tùy chọn thứ ba greeting = "Hello" là cách được sử dụng phổ biến nhất và là cách dễ đọc nhất để viết mã, đặc biệt là khi xem xét nó trong ngữ cảnh của một chương trình lớn hơn.

Điều quan trọng là phải giữ cho toàn bộ phong cách của dự án mã hóa của bạn nhất quán. Từ tổ chức này sang tổ chức khác, bạn sẽ gặp phải các nguyên tắc khác nhau để tuân theo, vì vậy bạn cũng phải linh hoạt.

Chúng ta sẽ xem qua một số ví dụ mã bên dưới để bạn tự làm quen với cú pháp và cấu trúc của mã JavaScript và tham khảo lại bài viết này khi có thắc mắc.

Khoảng trắng (whitespace)

Khoảng trắng trong JavaScript bao gồm space, tab và dòng mới (nhấn ENTER trên bàn phím). Như đã trình bày trước đó, JavaScript bỏ qua quá nhiều khoảng trắng bên ngoài chuỗi và khoảng trắng giữa các toán tử và các ký hiệu khác. Điều này có nghĩa là ba ví dụ sau đây về phép gán biến sẽ có cùng một đầu ra được tính toán chính xác:

const userLocation      =    "New York City, "     +  "NY";
const userLocation="New York City, "+"NY";
const userLocation = "New York City, " + "NY";

userLocation sẽ đại diện cho “New York City, NY” bất kể kiểu nào trong số này được viết bằng script, cũng không tạo ra sự khác biệt đối với JavaScript cho dù khoảng trắng được viết bằng tab hay dấu cách.

Một nguyên tắc chung để có thể tuân theo các quy ước về khoảng trắng phổ biến nhất là tuân theo các quy tắc tương tự như bạn đã quen trong toán học và ngữ pháp ngôn ngữ.

Ví dụ, let x = 5 * y là dễ đọc hơn let x=5*y.

Một ngoại lệ đáng chú ý đối với kiểu này mà bạn có thể thấy là trong quá trình gán nhiều biến. Lưu ý vị trí của = trong ví dụ sau:

const companyName         = "DigitalOcean";
const companyHeadquarters = "New York City";
const companyHandle       = "digitalocean";

Tất cả các toán tử gán (=) được xếp thẳng hàng, với khoảng trắng sau biến. Loại cấu trúc tổ chức này không được sử dụng bởi mọi cơ sở mã, nhưng có thể được sử dụng để cải thiện khả năng đọc.

Các dòng mới thừa cũng bị JavaScript bỏ qua. Nói chung, một dòng mới bổ sung sẽ được chèn phía trên nhận xét và sau khối mã.

Dấu ngoặc đơn ()

Đối với các từ khóa như ifswitch và for, dấu cách thường được thêm vào trước và sau dấu ngoặc đơn. Quan sát các ví dụ sau về so sánh và vòng lặp.

// Một ví dụ về cú pháp if

if () { }

// Kiểm tra điều kiện và in 1 chuỗi ra console

if (4 < 5) {

console.log("4 is less than 5.");

}

// Một ví dụ cho cú pháp for

for () { }

// Lặp 10 lần, in từng số ra console mỗi làn lặp

for (let i = 0; i <= 10; i++) {

console.log(i);

}

Như đã chứng minh, câu lệnh if và vòng lặp for có khoảng trắng ở mỗi bên của dấu ngoặc đơn (nhưng không có bên trong dấu ngoặc đơn).

Khi mã liên quan đến một hàm, phương thức hoặc lớp, các dấu ngoặc đơn sẽ chạm vào tên tương ứng.

// Một ví dụ về hàm

function functionName() {}


// Tạo một hàm để tính thể tích khối lập phương

function cube(number) {

return Math.pow(number, 3);

}


// Gọi hàm

cube(5);

Trong ví dụ trên, cube() là một hàm và cặp dấu ngoặc đơn () sẽ chứa các tham số hoặc đối số. Trong trường hợp này, các tham số và đối số tương ứng là number và 5. Mặc dù cube() với một khoảng trống bổ sung là hợp lệ trong đó mã sẽ thực thi như mong đợi, nó hầu như không bao giờ được nhìn thấy. Giữ chúng cùng nhau giúp dễ dàng liên kết tên hàm với cặp dấu ngoặc đơn và bất kỳ đối số được truyền liên quan nào.

Dấu chấm phẩy

Các chương trình JavaScript bao gồm một loạt các hướng dẫn được gọi là các câu lệnh, cũng giống như các đoạn văn được viết bao gồm một loạt các câu. Trong khi một câu sẽ kết thúc bằng dấu chấm, một câu lệnh JavaScript thường (nhưng không bắt buộc) kết thúc bằng dấu chấm phẩy (;).

// Một câu lệnh JavaScript
const now = new Date();

Nếu hai hoặc nhiều câu lệnh nằm cạnh nhau, bắt buộc phải tách chúng bằng dấu chấm phẩy.

// Lấy thời gian hiện thời và in chúng ra console
const now = new Date(); console.log(now);

Nếu các câu lệnh được phân tách bằng một dòng mới, thì dấu chấm phẩy là tùy chọn.

// Hai lệnh phân biệt nhau bằng dòng mới (xuống dòng)
const now = new Date()
console.log(now)

Một quy ước chung và an toàn là tách các câu lệnh bằng dấu chấm phẩy bất kể dòng mới. Nói chung, việc đưa chúng vào để giảm xác suất sai sót được coi là thông lệ tốt.

// Hai lệnh sau phân cách nhau bằng xuống dòng và chấm phẩy
const now = new Date();
console.log(now);

Dấu chấm phẩy cũng được yêu cầu giữa quá trình khởi tạo, điều kiện và sự tăng giảm của một vòng lặp for.

for (initialization; condition; increment) {

// run the loop

}
Dấu chấm phẩy không được bao gồm sau bất kỳ loại câu lệnh khối nào, chẳng hạn như iffordowhileclassswitch và function. Các câu lệnh khối này được chứa trong dấu ngoặc nhọn {}. Lưu ý các ví dụ dưới đây.
// Tạo một hàm để tính diện tích hình vuông

function square(number) {

return Math.pow(number, 2);

}


// Tính diện tích nếu number > 0

if (number > 0) {

square(number);

}
 
Hãy cẩn thận, vì không phải tất cả mã được đặt trong dấu ngoặc nhọn sẽ kết thúc mà không có dấu chấm phẩy. Điển hình là các đối tượng được đặt trong dấu ngoặc nhọn và phải kết thúc bằng dấu chấm phẩy.
// Ví dụ về đối tượng

const objectName = {};


// Tạo đối tượng triangle

const triangle = {

  type: "right",

  angle: 90,

  sides: 3,

};

Thực tế được chấp nhận rộng rãi là nên bao gồm dấu chấm phẩy sau mỗi câu lệnh JavaScript ngoại trừ các câu lệnh khối, kết thúc bằng dấu ngoặc nhọn.

Thụt lề (Indentation)

Về mặt kỹ thuật, một chương trình JavaScript hoàn chỉnh có thể được viết trên một dòng. Tuy nhiên, điều này sẽ nhanh chóng trở nên rất khó đọc và duy trì. Thay vào đó, ta sẽ sử dụng dòng mới và thụt lề.

Đây là một ví dụ về câu lệnh điều kiện if/else, được viết trên một dòng và với dòng mới và thụt lề.

// Lệnh điều kiện được viết trên một dòng

if (x === 1) { /* execute code if true */ } else { /* execute code if false */ }


// Lệnh điều kiện với thụt lề

if (x === 1) {

  // thực thi khối lệnh nếu true

} else {

  // thực thi khối lệnh nếu false

}

Lưu ý rằng bất kỳ mã nào được bao gồm trong một khối đều được thụt lề. Thụt lề có thể được thực hiện với hai dấu cách, bốn dấu cách hoặc bằng cách nhấn vào ký tự tab. Việc sử dụng các tab hoặc khoảng trắng hay không là tùy thuộc vào sở thích cá nhân của bạn (cho một dự án cá nhân) hoặc hướng dẫn của tổ chức của bạn (cho một dự án cộng tác).

Bao gồm dấu ngoặc nhọn ở cuối dòng đầu tiên, như trong ví dụ trên, là cách thông thường để cấu trúc các câu lệnh và đối tượng khối JavaScript. Một cách khác bạn có thể thấy các câu lệnh khối được viết là với các dấu ngoặc nhọn trên các dòng riêng của chúng.

// Điều kiện với cặp ngoặc xoắn được đặt ở dòng mới

if (x === 1)

{

  // thực thi khối lệnh nếu true

}

else

{

  // thực thi khối lệnh nếu false

}

Kiểu này ít phổ biến hơn trong JavaScript cũng như trong các ngôn ngữ khác, nhưng không phải là chưa từng thấy.

Bất kỳ câu lệnh khối lồng nhau nào sẽ được thụt vào sâu hơn.

// Tạo một hàm

function isEqualToOne(x) {

// Kiểm tra nếu x bằng 1

if (x === 1) {

  // khối lệnh và return true

  return true;

} else {

  return false;

}

}

Việc thụt lề thích hợp cho mã của bạn là điều bắt buộc để duy trì khả năng đọc và giảm thiểu nhầm lẫn. Một ngoại lệ đối với quy tắc này cần lưu ý là các thư viện nén sẽ có những ký tự không cần thiết bị xóa, do đó cần kết xuất kích thước tệp nhỏ hơn để cho phép thời gian tải trang nhanh hơn (như trong jquery.min.js và d3.min.js).

Định danh (Identifier)

Tên của một biến, hàm hoặc thuộc tính được biết đến như một mã định danh trong JavaScript. Định danh bao gồm các chữ cái và số, nhưng chúng không thể bao gồm bất kỳ ký hiệu nào bên ngoài $ và _ và không được bắt đầu bằng một số.

Trường hợp nhạy cảm

Những tên này phân biệt chữ hoa chữ thường. Hai ví dụ sau, myVariable và myvariable sẽ đề cập đến hai biến khác nhau.

var myVariable = 1;
var myvariable = 2;

Quy ước về tên JavaScript là chúng được viết bằng camelCase (quy ước lạc đà), có nghĩa là từ đầu tiên là chữ thường nhưng mọi từ sau đều bắt đầu bằng chữ hoa. Bạn cũng có thể thấy các biến hoặc hằng số toàn cục được viết bằng chữ hoa, phân tách bằng dấu gạch dưới.

const INSURANCE_RATE = 0.4;

Ngoại lệ của quy tắc này là tên lớp, thường được viết với mọi từ bắt đầu bằng chữ hoa (PascalCase).

// Tạo một lớp

class ExampleClass {

  constructor() { }

}

Để đảm bảo rằng mã có thể đọc được, cách tốt nhất là sử dụng các định danh rõ ràng khác nhau trong các tệp chương trình của bạn.

Từ khóa dành riêng

Định danh cũng không được bao gồm bất kỳ từ khóa dành riêng nào. Từ khóa là các từ trong ngôn ngữ JavaScript có chức năng tích hợp, chẳng hạn như variffor và this.

Ví dụ: bạn sẽ không thể gán giá trị cho một biến có tên var.

var var = "Some value";

Vì JavaScript hiểu var là một từ khóa, điều này sẽ dẫn đến lỗi cú pháp:

SyntaxError: Unexpected token (1:4)

Để có tài liệu tham khảo đầy đủ, vui lòng xem danh sách các từ khóa dành riêng (MDN)

Kết luận

Bài viết này đã cung cấp một cái nhìn tổng quan về cú pháp và cấu trúc mã cơ bản của JavaScript. Cú pháp rất quan trọng đối với việc thực hiện đúng chương trình cũng như khả năng đọc và khả năng bảo trì cho cả bạn và cộng tác viên trên mã của bạn.

Chúng tôi đã xem xét nhiều quy ước chung về cú pháp và kiểu JavaScript trong bài viết này, nhưng cuối cùng, điều quan trọng nhất cần nhớ là phải linh hoạt và nhất quán với nhóm hoặc tổ chức của bạn.

» Tiếp: Cách viết comment (nhận xét) trong JavaScript
« Trước: Cách viết chương trình JavaScript đầu tiên
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!