JavaScript

Bách khoa toàn thư mở Wikipedia
JavaScript
JavaScript
Ảnh chụp màn hình mã nguồn JavaScript
Mẫu hìnhMulti-paradigm: scripting, object-oriented (prototype-based), imperative, functional[1]
Thiết kế bởiBrendan Eich
Nhà phát triểnNetscape Communications Corporation, Mozilla Foundation, Ecma International
Xuất hiện lần đầutháng 5 năm 1995; 29 năm trước (1995-05)
Phiên bản ổn định
ECMAScript 6[2] / 17 tháng 6 năm 2015; 8 năm trước (2015-06-17)
Kiểm tra kiểudynamic, duck
Trang mạngwww.ecma-international.org/publications-and-standards/standards/ecma-262/
Các bản triển khai lớn
Carakan, Chakra, KJS, Nashorn, Rhino, SpiderMonkey, V8
Ảnh hưởng từ
Lua, Scheme, Perl, Self, Java, C, Python, AWK, HyperTalk
Ảnh hưởng tới
ActionScript, AssemblyScript, CoffeeScript, Dart, Haxe, JS++, Objective-J, Opa, TypeScript

JavaScript, theo phiên bản hiện hành, là một ngôn ngữ lập trình được phát triển từ các ý niệm nguyên mẫu. Ngôn ngữ này được dùng rộng rãi cho các trang web (phía người dùng) cũng như phía máy chủ (với Nodejs). Nó vốn được phát triển bởi Brendan Eich tại Hãng truyền thông Netscape với cái tên đầu tiên Mocha, rồi sau đó đổi tên thành LiveScript, và cuối cùng thành JavaScript. Giống Java, JavaScript có cú pháp tương tự C, nhưng nó gần với Self hơn Java. .js là phần mở rộng thường được dùng cho tập tin mã nguồn JavaScript.

Phiên bản mới nhất của JavaScript là ECMAScript 12[3]. ECMAScript là phiên bản chuẩn hóa của JavaScript. Trình duyệt Mozilla phiên bản 1.8 beta 1 có hỗ trợ không đầy đủ cho E4X - phần mở rộng cho JavaScript hỗ trợ làm việc với XML, được chuẩn hóa trong ECMA-357.

Java, JavaScript và JScript[sửa | sửa mã nguồn]

Cùng thời điểm Netscape bắt đầu sử dụng Java trên trình duyệt Netscape, LiveScript đã được đổi tên thành JavaScript để được chú ý hơn bởi ngôn ngữ lập trình Java lúc đó đang được coi là một hiện tượng. JavaScript được bổ sung vào trình duyệt Netscape bắt đầu từ phiên bản 2.0b3 của trình duyệt này vào tháng 12 năm 1995. Trên thực tế, JavaScript không được phát triển dựa từ Java. Do đó JavaScript chỉ dựa trên các cách đặt tên của Java. Java Script gồm 2 mảng là client-server thực hiện lệnh trên máy của end-user và web-server.

Sau thành công của JavaScript, Microsoft bắt đầu phát triển JScript, một ngôn ngữ có cùng ứng dụng và tương thích với JavaScript. JScript được bổ sung vào trình duyệt Internet Explorer bắt đầu từ Internet Explorer phiên bản 3.0 được phát hành tháng 8 năm 1996.

DOM (Document Object Model), một khái niệm thường được nhắc đến với JavaScript trên thực tế không phải là một phần của chuẩn ECMAScript, DOM là một chuẩn riêng biệt có liên quan chặt chẽ với XML.

Ứng dụng[sửa | sửa mã nguồn]

JavaScript là một ngôn ngữ lập trình dựa trên nguyên mẫu với cú pháp phát triển từ C. Giống như C, JavaScript có khái niệm từ khóa, do đó, JavaScript gần như không thể được mở rộng.

Cũng giống như C, JavaScript không có bộ xử lý xuất/nhập (input/output) riêng. Trong khi C sử dụng thư viện xuất/nhập chuẩn, JavaScript dựa vào phần mềm ngôn ngữ được gắn vào để thực hiện xuất/nhập.

Trên trình duyệt, rất nhiều trang web sử dụng JavaScript để thiết kế trang web động và một số hiệu ứng hình ảnh thông qua DOM. JavaScript được dùng để thực hiện một số tác vụ không thể thực hiện được với chỉ HTML như kiểm tra thông tin nhập vào, tự động thay đổi hình ảnh,... Ở Việt Nam, JavaScript còn được ứng dụng để làm bộ gõ tiếng Việt giống như bộ gõ hiện đang sử dụng trên trang Wikipedia tiếng Việt. Tuy nhiên, mỗi trình duyệt áp dụng JavaScript khác nhau và không tuân theo chuẩn W3C DOM, do đó trong rất nhiều trường hợp lập trình viên phải viết nhiều phiên bản của cùng một đoạn mã nguồn để có thể hoạt động trên nhiều trình duyệt. Một số công nghệ nổi bật dùng JavaScript để tương tác với DOM bao gồm DHTML, Ajax và SPA.

Bên ngoài trình duyệt, JavaScript có thể được sử dụng trong tập tin PDF của Adobe Acrobat và Adobe Reader. Điều khiển Dashboard trên hệ điều hành Mac OS X phiên bản 10.4 cũng có sử dụng JavaScript. Công nghệ kịch bản linh động (active scripting) của Microsoft có hỗ trợ ngôn ngữ JScript làm một ngôn ngữ kịch bản dùng cho hệ điều hành. JScript.NET là một ngôn ngữ tương thích với CLI gần giống JScript nhưng có thêm nhiều tính năng lập trình hướng đối tượng.

Từ khi Nodejs ra đời vào năm 2009, Javascript được biết đến nhiều hơn là một ngôn ngữ đa nền tảng khi có thể chạy trên cả môi trường máy chủ cũng như môi trường nhúng.

Mỗi ứng dụng này đều cung cấp mô hình đối tượng riêng cho phép tương tác với môi trường chủ, với phần lõi là ngôn ngữ lập trình JavaScript gần như giống nhau.

Các thành phần cú pháp chính[sửa | sửa mã nguồn]

Khoảng trắng[sửa | sửa mã nguồn]

Dấu cách, tab và ký tự dòng mới sử dụng bên ngoài một chuỗi ký tự được gọi là khoảng trắng. Khác với C, khoảng trắng trong JavaScript có thể ảnh hưởng trực tiếp tới ý nghĩa của câu lệnh. Sử dụng phương pháp "tự động thêm dấu chấm phẩy", bất cứ một dòng JavaScript nào thích hợp sẽ được coi là một câu lệnh hợp lệ (giống như có dấu chấm phẩy trước ký tự dòng mới).

Tuy trong phần lớn trường hợp, dấu chấm phẩy trước khi kết thúc một dòng JavaScript là không cần thiết để đoạn mã nguồn hoạt động chính xác, lập trình viên nên sử dụng dấu chấm phẩy sau mỗi câu lệnh để đoạn mã nguồn dễ nhìn hơn. Ngoài ra, do đặc thù của JavaScript - chuyên dùng trên trang web, kích cỡ của đoạn mã nguồn là quan trọng, có một số phần mềm có thể làm giảm kích cỡ của đoạn mã nguồn JavaScript bằng cách bỏ đi những khoảng trắng không cần thiết, để những phần mềm này hoạt động chính xác, lập trình viên cần thêm dấu chấm phẩy vào cuối mỗi câu lệnh.

Chú thích[sửa | sửa mã nguồn]

Cú pháp chú thích của JavaScript giống với C++. Lập trình viên có thể chú thích trên nhiều dòng bằng cách bao bọc chú thích với /* và */ hoặc sử dụng // để chú thích từ vị trí // đến hết dòng.

// Đây là chú thích trên một dòng.
/*
   Đây là chú thích trên nhiều dòng.
   Đây là chú thích 1
   Đây là chú thích 2
*/

Biến[sửa | sửa mã nguồn]

Trước khi sử dụng biến trong JavaScript, lập trình viên không nhất thiết phải khai báo biến. Có 3 cách để định nghĩa biến trong JavaScript:

// ECMAScript 5 trở về trước
var tên_biến
// Từ ECMAScript 6
let ten_bien
const ten_hang
// giá trị của biến khi được khai báo bằng const không thay đổi được giá trị

Ngoài ra, lập trình viên có thể chỉ việc gán cho biến một giá trị để sử dụng biến đó. Biến được định nghĩa ngoài tất cả các hàm hoặc được sử dụng mà không khai báo với cú pháp var sẽ được coi là biến toàn cục, những biến này có thể sử dụng trên toàn trang web. Biến được khai báo với var bên trong một hàm là biến cục bộ của hàm đó và chỉ có thể sử dụng được bên trong hàm đó.

Từ ECMAScript 6 trở đi, có thể khai báo với let và const để chỉ biến có thể thay đổi hoặc không thay đổi được.

Toán tử[sửa | sửa mã nguồn]

Một toán tử xác định phép toán sẽ được thực hiện trên các giá trị của các biến, và các biểu thức. Javascript cung cấp nhiều loại toán tử khác nhau để thực hiện việc tính toán, và đánh giá từ đơn giản đến phức tạp.

Các toán tử của Javascript được phân thành sáu thể loại dựa trên loại hành động của chúng thực hiện với các toán hạng. Bao gồm toán tử số học, toán tử quan hệ, toán tử luận lý, toán tử thao tác bit, toán tử gán, toán tử đặc biệt.

Toán tử số học[sửa | sửa mã nguồn]

Các toán tử số học là các toán tử nhị phân, khi chúng thực hiện các phép tính cơ bản trên hai toán hạng. Toán tử xuất hiện ở giữa hai toán hạng, cho phép bạn thực hiện các phép tính với giá trị số và chuỗi. Các toán tử bao gồm: + (cộng), - (trừ), * (nhân), / (chia), % (chia lấy dư).

Ví dụ:

var result;
result = 2 + 4; // result = 6
result = 2 - 4; // result = -2
result = 2 * 4; // result = 8
result = 2 / 4; // result = 0.5
result = 2 % 4; // result = 2

Toán tử tăng, và giảm[sửa | sửa mã nguồn]

Các toán tử tăng và giảm là các toán tử đơn hạng, vì chúng chỉ thực hiện được trên một toán hạng duy nhất. Toán tử tăng làm tăng giá trị lên 1, trong khi toán tử giảm làm giảm giá trị xuống 1, các toán tử có thể được đặt trước, hoặc sau toán hạng. Các toán tử bao gồm: ++ (tăng), -- (giảm).

Ví dụ:

var x = 2;
var y;
y = x++; // x = 3, y = 2
y = ++x; // x = 3, y = 3
y = x--; // x = 1, y = 2
y = --x; // x = 1, y = 1

Toán tử quan hệ[sửa | sửa mã nguồn]

Toán tử quan hệ là các toán tử dùng để so sánh giữa hai toán hạng. Sau khi thực hiện một so sánh, chúng trả lại một giá trị true (đúng) hay false (sai). Các toán tử bao gồm: == (bằng nhau), != (khác nhau), === (bằng nhau và cùng loại), !== (khác nhau và khác loại), > (lớn hơn), < (nhỏ hơn), >= (lớn hơn hoặc bằng), <= (nhỏ hơn hoặc bằng).

Ví dụ:

var result;
result = 3 == "3"; // result = true
result = 3 != 3; // result = false
result = 3 === "3"; // result = false
result = 3 !== "3"; // result = true
result = 3 > 4; // result = false
result = 3 < 4; // result = true
result = 3 >= 3; // result = true
result = 3 <= 4; // result = true

Toán tử luận lý[sửa | sửa mã nguồn]

Các toán tử luận lý là các toán tử nhị phân thực hiện các phép toán logic trên hai toán hạng. Chúng thuộc loại toán tử quan hệ, vì chúng trả về một giá trị boolean. Các toán tử bao gồm: && (và), || (hoặc), ! (phủ định).

Ví dụ:

var x = 2, y = 5;
var result;
result = (x == 3) && (y == 5); // result = false
result = (x == 3) || (y == 5); // result = true
result = !(x == 3); // result = true

Toán tử đặc biệt[sửa | sửa mã nguồn]

Toán tử điều kiện còn được biết đến với tên gọi toán tử 3 ngôi. Cú pháp của toán tử này như sau:

điều_kiện ? biểu_thức_đúng : biểu_thức_sai;

Toán tử này sẽ trả lại giá trị là kết quả của biểu_thức_đúng nếu điều_kiện có giá trị boolean bằng true, ngược lại nó sẽ trả lại giá trị bằng biểu_thức_sai.

Câu lệnh điều khiển[sửa | sửa mã nguồn]

Câu lệnh if... else[sửa | sửa mã nguồn]

Cú pháp if... else dùng trong trường hợp muốn rẽ nhánh theo điều kiện. Cú pháp này tương đương với nếu x thì làm y, còn nếu không thì làm z. Các câu lệnh if... else có thể lồng trong nhau.

Cú pháp:

if (biểu_thức_1) {
    khối lệnh được thực hiện nếu biểu thức 1 đúng;
}
else if (biểu_thức_2) {
    khối lệnh được thực hiện nếu biểu thức 1 sai và biểu thức 2 đúng;
}
else {
    khối lệnh được thực hiện nếu cả hai biểu thức trên đều sai;
}

Ví dụ:

var x = prompt("Nhập vào giá trị của x:");
x = parseFloat(x);

if (!isNaN(x)) {
    if (x > 0) {
        alert("x > 0");
    }
    else if (x == 0) {
        alert("x = 0");
    }
    else {
        alert("x < 0");
    }
}
else {
    alert("giá trị bạn nhập không phải là một số");
}

Đoạn mã nguồn trên mở một hộp thoại yêu cầu nhập vào một giá trị số, sau đó hiển thị thông báo số đó lớn hơn 0, bằng 0 hay nhỏ hơn 0.

Câu lệnh switch... case[sửa | sửa mã nguồn]

Cú pháp switch cũng là cú pháp điều kiện như if... else hay toán tử tam phân. Tuy nhiên, cú pháp switch thường được dùng khi chỉ cần so sánh bằng với số lượng kết quả cần kiểm tra lớn. Cách sử dụng cú pháp switch:

switch (biểu_thức_điều_kiện) {
    case kết_quả_1:
        khối lệnh cần thực hiện nếu biểu_thức_điều_kiện bằng kết_quả_1;
        break;
    case kết_quả_2:
        khối lệnh cần thực hiện nếu biểu_thức_điều_kiện bằng kết_quả_2;
        break;
    default:
        khối lệnh cần thực hiện nếu biểu_thức_điều_kiện cho ra một kết quả khác;
        break;
}

Sau mỗi khối lệnh trong một mục kiểm tra kết quả (trừ mục default), lập trình viên cần phải thêm vào break.

Vòng lặp[sửa | sửa mã nguồn]

Vòng lặp while[sửa | sửa mã nguồn]

Vòng lặp while có mục đích lặp đi lặp lại một khối lệnh nhất định cho đến khi biểu thức điều kiện trả về false. Khi dùng vòng lặp while phải chú ý tạo lối thoát cho vòng lặp (làm cho biểu thức điều kiện có giá trị false), nếu không đoạn mã nguồn sẽ rơi vào vòng lặp vô hạn, là một lỗi lập trình. Vòng lặp while thường được dùng khi lập trình viên không biết chính xác cần lặp bao nhiêu lần. Cú pháp của vòng lặp while như sau:

while (biểu_thức_điều_kiện) {
    khối lệnh cần thực hiện nếu biểu_thức_điều_kiện trả về true;
}

Vòng lặp do... while[sửa | sửa mã nguồn]

Về cơ bản, vòng lặp do... while gần như giống hệt như vòng lặp while. Tuy nhiên, trong trường hợp biểu thức điều kiện trả về false ngay từ đầu, khối lệnh trong vòng lặp while sẽ không bao giờ được thực hiện, trong khi đó, vòng lặp do... while luôn đảm bảo khối lệnh trong vòng lặp được thực hiện ít nhất một lần. Ví dụ:

do {
    alert("do... while"); // Bạn sẽ nhận được thông báo "do... while" một lần duy nhất
} while (0 > 1);

Cú pháp của vòng lặp do... while như sau:

do {
        khối lệnh;
}
while (biểu_thức_điều_kiện);

Vòng lặp for[sửa | sửa mã nguồn]

Vòng lặp for thường được sử dụng khi cần lặp một khối lệnh mà lập trình viên biết trước sẽ cần lặp bao nhiêu lần. Cú pháp của vòng lặp for như sau:

for