Toán tử một ngôi ECMAScript

一元运算符只有一个参数,即要操作的对象或值。它们是 ECMAScript 中最简单的运算符。

delete

delete 运算符删除对以前定义的对象属性或方法的引用。例如:

var o = new Object;
o.name = "David";
alert(o.name);	//输出 "David"
delete o.name;
alert(o.name);	// Xuất ra "undefined"

Trong ví dụ này, thuộc tính name được xóa, có nghĩa là buộc phải giải phóng tham chiếu đến nó, đặt nó thành undefined (tức là giá trị của biến chưa được khởi tạo).

Toán tử delete không thể xóa thuộc tính và phương thức không được nhà phát triển định nghĩa. Ví dụ, đoạn mã dưới đây sẽ gây ra lỗi:

delete o.toString;

Dù tên phương thức toString là hợp lệ, dòng mã này cũng sẽ gây ra lỗi vì phương thức toString() là phương thức ECMAScript nguyên thuỷ, không phải là phương thức được nhà phát triển định nghĩa.

void

Toán tử void trả về undefined cho bất kỳ giá trị nào. Toán tử này thường được sử dụng để tránh xuất ra giá trị không nên xuất, ví dụ, khi gọi hàm JavaScript từ phần tử <a> của HTML. Để làm điều này một cách chính xác, hàm không thể trả về giá trị hợp lệ, nếu không trình duyệt sẽ xóa trang, chỉ hiển thị kết quả của hàm. Ví dụ:

<a href="javascript:window.open('about:blank')">Nhấn tôi</a>

Nếu bạn đặt dòng mã này vào trang HTML, nhấn vào liên kết trong đó, bạn sẽ thấy "[object]" hiển thị trên màn hình.TIY

Đây là vì phương thức window.open() trả về tham chiếu đến cửa sổ mới được mở. Sau đó, đối tượng này sẽ được chuyển đổi thành chuỗi để hiển thị.

Để tránh hiệu ứng này, có thể sử dụng toán tử void để gọi hàm window.open():

<a href="javascript:void(window.open('about:blank'))">Nhấn tôi</a>

Điều này làm cho gọi hàm window.open() trả về undefined, nó không phải là giá trị hợp lệ, sẽ không hiển thị trong cửa sổ trình duyệt.

Lưu ý:Hãy nhớ rằng, các hàm không có giá trị trả về thực sự đều trả về undefined.

Toán tử tiền tố tăng/giảm

Hai toán tử được mượn trực tiếp từ C (và Java) là toán tử tiền tố tăng và giảm.

Toán tử tiền tố tăng trước là tăng giá trị số lên 1, dưới dạng đặt hai dấu cộng (+) trước biến:

var iNum = 10;
++iNum;

Dòng mã thứ hai tăng giá trị của iNum lên 11, nó tương đương với:

var iNum = 10;
iNum = iNum + 1;

Cũng vậy, toán tử giảm tiền tố từ giá trị số là giảm 1, dưới dạng đặt hai dấu trừ (-) trước biến:

var iNum = 10;
--iNum;

Trong ví dụ này, dòng mã thứ hai giảm giá trị của iNum xuống 9.

Khi sử dụng toán tử tiền tố, chú ý rằng toán tử tăng và giảm đều xảy ra trước khi tính toán biểu thức. Dưới đây là một ví dụ:

var iNum = 10;
--iNum;
alert(iNum);	// xuất ra "9"
alert(--iNum);	// xuất ra "8"
alert(iNum);	// xuất ra "8"

Dòng mã thứ hai thực hiện toán tử giảm sau cùng nhau trên iNum, dòng mã thứ ba hiển thị kết quả ("9"). Dòng mã thứ tư lại thực hiện toán tử giảm sau cùng nhau trên iNum, nhưng lần này toán tử giảm trước cùng nhau và thao tác xuất ra xuất hiện trong cùng một câu lệnh, kết quả hiển thị là "8". Để chứng minh rằng tất cả các thao tác giảm đều đã được thực hiện, dòng mã thứ năm lại xuất ra "8".

Trong biểu thức toán học, độ ưu tiên của toán tử tăng trước và giảm trước cùng nhau, vì vậy cần tính toán theo thứ tự từ trái sang phải. Ví dụ:

var iNum1 = 2;
var iNum2 = 20;
var iNum3 = --iNum1 + ++iNum2;	// bằng "22"
var iNum4 = iNum1 + iNum2;		// bằng "22"

Trong đoạn mã trước, iNum3 bằng 22, vì biểu thức cần tính toán là 1 + 21. Biến iNum4 cũng bằng 22, cũng là 1 + 21.

Toán tử tăng/giảm sau cùng nhau

Còn có hai toán tử được mượn trực tiếp từ C (và Java), đó là toán tử tăng sau cùng nhau và toán tử giảm sau cùng nhau.

Toán tử tăng sau cùng nhau cũng tăng giá trị của số, dưới dạng đặt hai dấu cộng (+) sau biến:

var iNum = 10;
iNum++;

Không phải ngẫu nhiên, toán tử giảm sau cùng nhau cũng giảm 1 đơn vị từ giá trị, dưới dạng thêm hai dấu trừ (-) sau biến:

var iNum = 10;
iNum--;

Dòng mã thứ hai giảm giá trị của iNum xuống 9.

Khác với toán tử tiền tố, toán tử hậu tố thực hiện toán tử tăng hoặc giảm sau khi tính toán biểu thức chứa chúng. Dưới đây là ví dụ:

var iNum = 10;
iNum--;
alert(iNum);	// xuất ra "9"
alert(iNum--);	// xuất ra "9"
alert(iNum);	// xuất ra "8"

Giống như ví dụ về toán tử tiền tố, dòng mã thứ hai thực hiện toán tử giảm sau cùng nhau trên iNum, dòng mã thứ ba hiển thị kết quả ("9"). Dòng mã thứ tư tiếp tục hiển thị giá trị của iNum, nhưng lần này toán tử giảm sau cùng nhau được áp dụng trong cùng một câu lệnh. Do toán tử giảm sau cùng nhau xảy ra sau khi tính toán biểu thức, vì vậy giá trị được hiển thị bởi câu lệnh này là "9". Sau khi thực hiện dòng mã thứ năm, hàm alert hiển thị "8", vì trong khi thực hiện dòng mã thứ tư và trước khi thực hiện dòng mã thứ năm, đã thực hiện toán tử giảm sau cùng nhau.

Trong biểu thức toán học, độ ưu tiên của toán tử tăng và giảm sau cùng nhau, vì vậy cần tính toán theo thứ tự từ trái sang phải. Ví dụ:

var iNum1 = 2;
var iNum2 = 20;
var iNum3 = iNum1-- + iNum2++;	// bằng "22"
var iNum4 = iNum1 + iNum2;		// bằng "22"

Trong đoạn mã trước, iNum3 bằng 22, vì biểu thức cần tính là 2 + 20. Biến iNum4 cũng bằng 22, nhưng nó tính là 1 + 21, vì phép tăng và giảm đều xảy ra sau khi gán giá trị cho iNum3.

Toán tử tăng một ngôi và giảm một ngôi

Hầu hết mọi người đều quen thuộc với toán tử tăng một ngôi và giảm một ngôi, cách sử dụng của chúng trong ECMAScript tương tự như cách bạn đã học ở lớp toán cấp 2.

Toán tử tăng một ngôi không có tác dụng gì đối với số:

var iNum = 20;
iNum = +iNum;
alert(iNum);	//Xuất ra "20"

Mã này áp dụng toán tử tăng một ngôi cho số 20, kết quả vẫn là 20.

Mặc dù toán tử tăng một ngôi không có tác dụng đối với số, nhưng nó có hiệu ứng thú vị đối với chuỗi, sẽ chuyển đổi chuỗi thành số.

var sNum = "20";
alert(typeof sNum);	//Xuất ra "string"
var iNum = +sNum;
alert(typeof iNum);	//Xuất ra "number"

Mã này chuyển đổi chuỗi "20" thành số thực. Khi toán tử tăng một ngôi thực hiện các phép toán với chuỗi, cách tính toán của nó tương tự như parseInt(), khác biệt chính là chỉ có chuỗi bắt đầu bằng "0x" (biểu thị số mười六) mới có thể được toán tử chuyển đổi thành giá trị mười. Do đó, khi sử dụng toán tử tăng một ngôi để chuyển đổi "010", kết quả luôn là 10, trong khi "0xB" sẽ được chuyển đổi thành 11.

Về mặt khác, toán tử giảm một ngôi chính là tính âm của giá trị (ví dụ chuyển đổi 20 thành -20):

var iNum = 20;
iNum = -iNum;
alert(iNum);	//Xuất ra "-20"

Giống như toán tử tăng một ngôi, toán tử giảm một ngôi cũng sẽ chuyển đổi chuỗi thành số gần đúng, ngoài ra nó còn tính thêm giá trị âm cho giá trị đó. Ví dụ:

var sNum = "20";
alert(typeof sNum);	//Xuất ra "string"
var iNum = -sNum;
alert(iNum);		//Xuất ra "-20"
alert(typeof iNum);	//Xuất ra "number"

Trong đoạn mã trên, toán tử giảm một ngôi sẽ chuyển đổi chuỗi "-20" thành -20 (cách xử lý của toán tử giảm một ngôi đối với hệ số mười六 và hệ số mười tương tự như toán tử tăng một ngôi, nhưng nó còn tính thêm giá trị âm cho giá trị đó).