Chuyển đổi loại ECMAScript

Một trong những đặc điểm quan trọng nhất của tất cả các ngôn ngữ lập trình là khả năng chuyển đổi loại.

ECMAScript cung cấp cho nhà phát triển một lượng lớn các phương thức chuyển đổi đơn giản.

Hầu hết các loại đều có phương thức chuyển đổi đơn giản, và còn một số phương thức toàn cục có thể được sử dụng để chuyển đổi phức tạp hơn. Trong mọi trường hợp, việc chuyển đổi loại trong ECMAScript là một bước hoạt động ngắn gọn.

Chuyển đổi thành chuỗi

Điều thú vị của các giá trị nguyên thủy Boolean, số và chuỗi trong ECMAScript là chúng là đối tượng ảo, điều này có nghĩa là chúng thực sự có thuộc tính và phương thức.

Ví dụ, để lấy độ dài của chuỗi, bạn có thể sử dụng mã sau:

var sColor = "red";
alert(sColor.length);	// Hiển thị “3”

Mặc dù “red” là chuỗi loại nguyên thủy, nó vẫn có thuộc tính length để lưu trữ kích thước của chuỗi.

Tóm lại, ba loại loại nguyên thủy chính Boolean, số và chuỗi đều có phương thức toString(), có thể chuyển giá trị của chúng thành chuỗi.

Lưu ý:Bạn có thể hỏi, “Chuỗi có phương thức toString() không, điều này có thừa không?” Đúng vậy, thực sự như vậy, nhưng ECMAScript định nghĩa tất cả các đối tượng đều có phương thức toString(), bất kể nó là đối tượng ảo hay đối tượng thực. Bởi vì loại chuỗi thuộc đối tượng ảo, vì vậy nó chắc chắn có phương thức toString().

Phương thức toString() của loại Boolean chỉ xuất ra "true" hoặc "false", kết quả phụ thuộc vào giá trị của biến:

var bFound = false;
alert(bFound.toString());	//xuất ra "false"

Phương thức toString() của loại Number rất đặc biệt, nó có hai chế độ, tức làChế độ mặc địnhChế độ cơ số。Sử dụng chế độ mặc định, phương thức toString() chỉ xuất ra giá trị số tương ứng (mặc dù là số nguyên, số thập phân hay số biểu diễn dưới dạng số học), như sau:

var iNum1 = 10;
var iNum2 = 10.0;
alert(iNum1.toString());	//xuất ra "10"
alert(iNum2.toString());	//xuất ra "10"

Ghi chú:Trong chế độ mặc định, bất kể số được khai báo dưới dạng biểu diễn nào, phương thức toString() của loại Number luôn trả về biểu diễn số mười của số đó. Do đó, số được khai báo dưới dạng số nguyên hoặc số mười六 phân đều được xuất ra dưới dạng số mười.

Sử dụng mô hình cơ số của phương thức toString() loại Number, có thể sử dụngCơ sốXuất ra số, ví dụ cơ số của nhị phân là 2, cơ số của tám phân là 8, cơ số của十六 phân là 16.

Cơ sốChỉ là một cách khác để thêm số vào cơ số khác, đó là tham số của phương thức toString():

var iNum = 10;
alert(iNum.toString(2));	//xuất ra "1010"
alert(iNum.toString(8));	//xuất ra "12"
alert(iNum.toString(16));	//xuất ra "A"

Trong ví dụ trước, số 10 đã được xuất ra dưới 3 hình thức khác nhau: dưới dạng nhị phân, dạng tám phân và dạng十六 phân. HTML sử dụng dạng十六 phân để biểu diễn mỗi màu, chức năng này rất hữu ích khi xử lý số trong HTML.

Ghi chú:Gọi toString(10) đối với số và gọi toString() đều tương tự, chúng đều trả về dạng số mười của số đó.

Xem thêm:

Xem Tài liệu tham khảo JavaScriptThông tin chi tiết về phương thức toString() được cung cấp:

Chuyển đổi thành số

ECMAScript cung cấp hai phương thức để chuyển đổi các giá trị nguyên bản không phải số thành số, đó là parseInt() và parseFloat().

Như bạn có thể tưởng tượng, phương thức trước sẽ chuyển đổi giá trị thành số nguyên, phương thức sau sẽ chuyển đổi giá trị thành số thập phân. Chỉ khi gọi các phương thức này đối với loại String, chúng mới hoạt động đúng; đối với các loại khác, chúng sẽ trả về NaN.

parseInt()

Trước khi kiểm tra chuỗi có phải là giá trị số hay không, cả parseInt() và parseFloat() đều sẽ phân tích kỹ chuỗi đó.

Phương thức parseInt() sẽ kiểm tra ký tự tại vị trí 0 trước tiên, xem nó có phải là một ký tự số hợp lệ hay không; nếu không, phương thức sẽ trả về NaN và không tiếp tục thực hiện các操作 khác. Nhưng nếu ký tự đó là số hợp lệ, phương thức sẽ kiểm tra ký tự tại vị trí 1, thực hiện kiểm tra tương tự. Quá trình này sẽ tiếp tục cho đến khi phát hiện ký tự không hợp lệ, lúc đó parseInt() sẽ chuyển đổi chuỗi trước ký tự đó thành số.

Ví dụ, nếu muốn chuyển đổi chuỗi "12345red" thành số nguyên, phương thức parseInt() sẽ trả về 12345, vì khi nó kiểm tra đến ký tự r, nó sẽ dừng quá trình kiểm tra.

Các biểu thức số nguyên trong chuỗi sẽ được chuyển đổi thành số đúng, ví dụ "0xA" sẽ được chuyển đổi thành số 10. Tuy nhiên, chuỗi "22.5" sẽ được chuyển đổi thành 22, vì dấu chấm là ký tự vô hiệu đối với số nguyên.

Dưới đây là một số ví dụ:

var iNum1 = parseInt("12345red");	//trả về 12345
var iNum1 = parseInt("0xA");	//trả về 10
var iNum1 = parseInt("56.9");	//trả về 56
var iNum1 = parseInt("red");	//trả về NaN

Phương thức parseInt() còn có chế độ cơ số, có thể chuyển đổi chuỗi hệ số hai, tám, mười sáu hoặc bất kỳ hệ số nào khác thành số nguyên. Cơ số được chỉ định bởi tham số thứ hai của phương thức parseInt(), vì vậy để phân tích chuỗi hệ số mười sáu, bạn cần gọi phương thức parseInt() như sau:

var iNum1 = parseInt("AF", 16);	//trả về 175

Tất nhiên, đối với hệ số hai, tám và thập phân (mặc định), bạn có thể gọi phương thức parseInt() như sau:

var iNum1 = parseInt("10", 2);	//trả về 2
var iNum2 = parseInt("10", 8);	//trả về 8
var iNum3 = parseInt("10", 10);	//trả về 10

Nếu số thập phân chứa số không dẫn đầu, tốt nhất nên sử dụng cơ số 10 để không bị意外 nhận được giá trị tám.

var iNum1 = parseInt("010");	//trả về 8
var iNum2 = parseInt("010", 8);	//trả về 8
var iNum3 = parseInt("010", 10);	//trả về 10

Trong đoạn mã này, hai dòng mã đều giải mã chuỗi "010" thành một số. Dòng mã đầu tiên coi chuỗi này là giá trị tám, giải mã nó theo cách tương tự như dòng mã thứ hai (xác định cơ số là 8). Dòng mã cuối cùng xác định cơ số là 10, vì vậy iNum3 cuối cùng bằng 10.

Xem

Xem Tài liệu tham khảo JavaScriptCung cấp thông tin chi tiết về phương thức parseInt():parseInt().

parseFloat()

Phương thức parseFloat() xử lý tương tự như phương thức parseInt(), bắt đầu từ vị trí 0 xem xét từng ký tự, đến khi tìm thấy ký tự không hợp lệ đầu tiên, sau đó chuyển đổi chuỗi trước ký tự đó thành số.

Tuy nhiên, đối với phương thức này, dấu chấm phân số đầu tiên xuất hiện là ký tự hợp lệ. Nếu có hai dấu chấm phân số, dấu chấm phân số thứ hai sẽ được coi là không hợp lệ. parseFloat() sẽ chuyển đổi các ký tự trước dấu chấm phân số thành số. Điều này có nghĩa là chuỗi "11.22.33" sẽ được giải mã thành 11.22.

Một khác biệt khác khi sử dụng phương thức parseFloat() là chuỗi phải được biểu diễn dưới dạng số thập phân của số thập phân, không phải là số tám hoặc số mười sáu. Phương thức này sẽ bỏ qua số không dẫn đầu, vì vậy số tám 0102 sẽ được giải mã thành 102. Đối với số mười sáu 0xA, phương thức này sẽ trả về NaN, vì trong số thập phân, x không phải là ký tự hợp lệ。(Ghi chú:Đã được kiểm tra, việc triển khai cụ thể của trình duyệt sẽ trả về 0, thay vì NaN。)

Ngoài ra, phương thức parseFloat() cũng không có mô hình cơ bản.

Dưới đây là một số ví dụ sử dụng phương thức parseFloat():

var fNum1 = parseFloat("12345red");	//trả về 12345
var fNum2 = parseFloat("0xA");	//trả về NaN
var fNum3 = parseFloat("11.2");	//trả về 11.2
var fNum4 = parseFloat("11.22.33");	//trả về 11.22
var fNum5 = parseFloat("0102");	//trả về 102
var fNum1 = parseFloat("red");	//trả về NaN

Thử ngay

Xem

Xem Tài liệu tham khảo JavaScriptThông tin chi tiết về phương thức parseFloat() được cung cấp sau:parseFloat().

Chuyển đổi bắt buộc

Bạn cũng có thể sử dụngChuyển đổi bắt buộc (type casting)Để xử lý việc chuyển đổi loại của giá trị. Sử dụng chuyển đổi bắt buộc có thể truy cập vào giá trị cụ thể, ngay cả khi nó là loại khác.

Ghi chú của tác giả:cast có nghĩa là "đúc", rất phù hợp với ý nghĩa "chuyển đổi bắt buộc".

Có ba loại chuyển đổi bắt buộc có sẵn trong ECMAScript như sau:

  • Boolean(value) - Chuyển đổi giá trị cho trước thành Boolean;
  • Number(value) - Chuyển đổi giá trị cho trước thành số (có thể là số nguyên hoặc số thập phân);
  • String(value) - Chuyển đổi giá trị cho trước thành chuỗi;

Sử dụng một trong ba hàm này để chuyển đổi giá trị sẽ tạo ra một giá trị mới, lưu trữ giá trị được chuyển đổi trực tiếp từ giá trị gốc. Điều này có thể gây ra hậu quả không mong muốn.

Công thức Boolean()

Khi giá trị cần chuyển đổi là chuỗi có ít nhất một ký tự, số không phải là 0 hoặc đối tượng, hàm Boolean() sẽ trả về true. Nếu giá trị là chuỗi rỗng, số 0, undefined hoặc null, nó sẽ trả về false.

Bạn có thể kiểm tra việc chuyển đổi bắt buộc của Boolean bằng mã sau:

var b1 = Boolean("");		//false - chuỗi rỗng
var b2 = Boolean("hello");		//true - chuỗi không rỗng
var b1 = Boolean(50);		//true - số không phải là 0
var b1 = Boolean(null);		//false - null
var b1 = Boolean(0);		//false - số 0
var b1 = Boolean(new object());	//true - đối tượng

Công thức Number()

Công thức Number() chuyển đổi bắt buộc tương tự như phương thức parseInt() và parseFloat(), nhưng nó chuyển đổi toàn bộ giá trị,而不是 phần giá trị.

Bạn còn nhớ không, phương thức parseInt() và parseFloat() chỉ chuyển đổi chuỗi trước ký tự không hợp lệ đầu tiên, vì vậy "1.2.3" sẽ được chuyển đổi thành "1" và "1.2".

Sử dụng Number() để ép kiểu, "1.2.3" sẽ trả về NaN, vì giá trị chuỗi không thể chuyển đổi thành số. Nếu giá trị chuỗi có thể chuyển đổi hoàn toàn, Number() sẽ quyết định là gọi phương thức parseInt() hay parseFloat().

Bảng sau giải thích các tình huống xảy ra khi gọi phương thức Number() với các giá trị khác nhau:

Cách sử dụng Kết quả
Number(false) 0
Number(true) 1
Number(undefined) NaN
Number(null) 0
Number("1.2") 1.2
Number("12") 12
Number("1.2.3") NaN
Number(new object()) NaN
Number(50) 50

Hàm String()

Phương pháp ép kiểu cuối cùng là String() là đơn giản nhất, vì nó có thể chuyển đổi bất kỳ giá trị nào thành chuỗi.

Để thực hiện việc ép kiểu này, chỉ cần gọi phương thức toString() của giá trị được truyền làm tham số, tức là chuyển đổi 12 thành "12", chuyển đổi true thành "true", chuyển đổi false thành "false", và tiếp theo.

Điểm khác biệt duy nhất giữa việc ép kiểu thành chuỗi và gọi phương thức toString() là việc ép kiểu giá trị null và undefined có thể tạo ra chuỗi mà không gây ra lỗi:

var s1 = String(null);	//"null"
var oNull = null;
var s2 = oNull.toString();	//Sẽ gây ra lỗi

Khi xử lý ngôn ngữ loại yếu như ECMAScript, việc ép kiểu loại rất hữu ích, nhưng nên đảm bảo rằng sử dụng giá trị chính xác.